1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
|
#!./perl
BEGIN {
chdir 't' if -d 't';
@INC = '../lib';
require './test.pl';
}
sub foo {
my($a, $b) = @_;
my $c;
my $d;
$c = "ok 3\n";
$d = "ok 4\n";
{ my($a, undef, $c) = ("ok 9\n", "not ok 10\n", "ok 10\n");
($x, $y) = ($a, $c); }
is($a, "ok 1\n", 'value of sub argument maintained outside of block');
is($b, "ok 2\n", 'sub argument maintained');
is($c, "ok 3\n", 'variable value maintained outside of block');
is($d, "ok 4\n", 'variable value maintained');
}
$a = "ok 5\n";
$b = "ok 6\n";
$c = "ok 7\n";
$d = "ok 8\n";
&foo("ok 1\n","ok 2\n");
is($a, "ok 5\n", 'global was not affected by duplicate names inside subroutine');
is($b, "ok 6\n", '...');
is($c, "ok 7\n", '...');
is($d, "ok 8\n", '...');
is($x, "ok 9\n", 'globals modified inside of block keeps its value outside of block');
is($y, "ok 10\n", '...');
# same thing, only with arrays and associative arrays
sub foo2 {
my($a, @b) = @_;
my(@c, %d);
@c = "ok 13\n";
$d{''} = "ok 14\n";
{ my($a,@c) = ("ok 19\n", "ok 20\n", "ok 21\n"); ($x, $y) = ($a, @c); }
is($a, "ok 11\n", 'value of sub argument maintained outside of block');
is(scalar @b, 1, 'did not add any elements to @b');
is($b[0], "ok 12\n", 'did not alter @b');
is(scalar @c, 1, 'did not add arguments to @c');
is($c[0], "ok 13\n", 'did not alter @c');
is($d{''}, "ok 14\n", 'did not touch %d');
}
$a = "ok 15\n";
@b = "ok 16\n";
@c = "ok 17\n";
$d{''} = "ok 18\n";
&foo2("ok 11\n", "ok 12\n");
is($a, "ok 15\n", 'Global was not modifed out of scope');
is(scalar @b, 1, 'correct number of elements in array');
is($b[0], "ok 16\n", 'array value was not modified out of scope');
is(scalar @c, 1, 'correct number of elements in array');
is($c[0], "ok 17\n", 'array value was not modified out of scope');
is($d{''}, "ok 18\n", 'hash key/value pair is correct');
is($x, "ok 19\n", 'global was modified');
is($y, "ok 20\n", 'this one too');
my $i = "outer";
if (my $i = "inner") {
is( $i, 'inner', 'my variable inside conditional propagates inside block');
}
if ((my $i = 1) == 0) {
fail("nested parens do not propagate variable outside");
}
else {
is($i, 1, 'lexical variable lives available inside else block');
}
my $j = 5;
while (my $i = --$j) {
last unless is( $i, $j, 'lexical inside while block');
}
continue {
last unless is( $i, $j, 'lexical inside continue block');
}
is( $j, 0, 'went through the previous while/continue loop all 4 times' );
$j = 5;
for (my $i = 0; (my $k = $i) < $j; ++$i) {
fail(""), last unless $i >= 0 && $i < $j && $i == $k;
}
ok( ! defined $k, '$k is only defined in the scope of the previous for loop' );
curr_test(37);
$jj = 0;
foreach my $i (30, 31) {
is( $i, $jj+30, 'assignment inside the foreach loop variable definition');
$jj++;
}
is( $jj, 2, 'foreach loop executed twice');
is( $i, 'outer', '$i not modified by while/for/foreach using same variable name');
# Ensure that C<my @y> (without parens) doesn't force scalar context.
my @x;
{ @x = my @y }
is(scalar @x, 0, 'my @y without parens does not force scalar context');
{ @x = my %y }
is(scalar @x, 0, 'my %y without parens does not force scalar context');
# Found in HTML::FormatPS
my %fonts = qw(nok 35);
for my $full (keys %fonts) {
$full =~ s/^n//;
is( $fonts{nok}, 35, 'Supposed to be copy-on-write via force_normal after a THINKFIRST check.' );
}
# [perl #29340] optimising away the = () left the padav returning the
# array rather than the contents, leading to 'Bizarre copy of array' error
sub opta { my @a=() }
sub opth { my %h=() }
eval { my $x = opta };
is($@, '', ' perl #29340, No bizarre copy of array error');
eval { my $x = opth };
is($@, '', ' perl #29340, No bizarre copy of array error via hash');
sub foo3 {
++my $x->{foo};
ok(! defined $x->{bar}, '$x->{bar} is not defined');
++$x->{bar};
}
eval { foo3(); foo3(); };
is( $@, '', 'no errors while checking autovivification and persistence of hash refs inside subs' );
# my $foo = undef should always assign [perl #37776]
{
my $count = 35;
loop:
my $test = undef;
is($test, undef, 'var is undef, repeated test');
$test = 42;
goto loop if ++$count < 37;
}
# [perl #113554]
eval "my ()";
is( $@, '', "eval of my() passes");
#Variable number of tests due to the way the while/for loops are tested now
done_testing();
|