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 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218
|
#!./perl -w
BEGIN {
chdir 't' if -d 't';
@INC = '../lib';
require './test.pl';
}
use strict;
no warnings 'misc', 'experimental::lexical_topic';
$_ = 'global';
is($_, 'global', '$_ initial value');
s/oba/abo/;
is($_, 'glabol', 's/// on global $_');
{
my $_ = 'local';
is($_, 'local', 'my $_ initial value');
s/oca/aco/;
is($_, 'lacol', 's/// on my $_');
/(..)/;
is($1, 'la', '// on my $_');
cmp_ok(tr/c/d/, '==', 1, 'tr/// on my $_ counts correctly' );
is($_, 'ladol', 'tr/// on my $_');
{
my $_ = 'nested';
is($_, 'nested', 'my $_ nested');
chop;
is($_, 'neste', 'chop on my $_');
}
{
our $_;
is($_, 'glabol', 'gains access to our global $_');
}
is($_, 'ladol', 'my $_ restored');
}
is($_, 'glabol', 'global $_ restored');
s/abo/oba/;
is($_, 'global', 's/// on global $_ again');
{
my $_ = 11;
our $_ = 22;
is($_, 22, 'our $_ is seen explicitly');
chop;
is($_, 2, '...default chop chops our $_');
/(.)/;
is($1, 2, '...default match sees our $_');
}
$_ = "global";
{
my $_ = 'local';
for my $_ ("foo") {
is($_, "foo", 'for my $_');
/(.)/;
is($1, "f", '...m// in for my $_');
is(our $_, 'global', '...our $_ inside for my $_');
}
is($_, 'local', '...my $_ restored outside for my $_');
is(our $_, 'global', '...our $_ restored outside for my $_');
}
{
my $_ = 'local';
for ("implicit foo") { # implicit "my $_"
is($_, "implicit foo", 'for implicit my $_');
/(.)/;
is($1, "i", '...m// in for implicit my $_');
is(our $_, 'global', '...our $_ inside for implicit my $_');
}
is($_, 'local', '...my $_ restored outside for implicit my $_');
is(our $_, 'global', '...our $_ restored outside for implicit my $_');
}
{
my $_ = 'local';
is($_, "postfix foo", 'postfix for' ) for 'postfix foo';
is($_, 'local', '...my $_ restored outside postfix for');
is(our $_, 'global', '...our $_ restored outside postfix for');
}
{
for our $_ ("bar") {
is($_, "bar", 'for our $_');
/(.)/;
is($1, "b", '...m// in for our $_');
}
is($_, 'global', '...our $_ restored outside for our $_');
}
{
my $buf = '';
sub tmap1 { /(.)/; $buf .= $1 } # uses our $_
my $_ = 'x';
sub tmap2 { /(.)/; $buf .= $1 } # uses my $_
map {
tmap1();
tmap2();
ok( /^[67]\z/, 'local lexical $_ is seen in map' );
{ is(our $_, 'global', 'our $_ still visible'); }
ok( $_ == 6 || $_ == 7, 'local lexical $_ is still seen in map' );
{ my $_ ; is($_, undef, 'nested my $_ is undefined'); }
} 6, 7;
is($buf, 'gxgx', q/...map doesn't modify outer lexical $_/);
is($_, 'x', '...my $_ restored outside map');
is(our $_, 'global', '...our $_ restored outside map');
map { my $_; is($_, undef, 'redeclaring $_ in map block undefs it'); } 1;
}
{ map { my $_; is($_, undef, 'declaring $_ in map block undefs it'); } 1; }
{
sub tmap3 () { return $_ };
my $_ = 'local';
sub tmap4 () { return $_ };
my $x = join '-', map $_.tmap3.tmap4, 1 .. 2;
is($x, '1globallocal-2globallocal', 'map without {}');
}
{
for my $_ (1) {
my $x = map $_, qw(a b);
is($x, 2, 'map in scalar context');
}
}
{
my $buf = '';
sub tgrep1 { /(.)/; $buf .= $1 }
my $_ = 'y';
sub tgrep2 { /(.)/; $buf .= $1 }
grep {
tgrep1();
tgrep2();
ok( /^[89]\z/, 'local lexical $_ is seen in grep' );
{ is(our $_, 'global', 'our $_ still visible'); }
ok( $_ == 8 || $_ == 9, 'local lexical $_ is still seen in grep' );
} 8, 9;
is($buf, 'gygy', q/...grep doesn't modify outer lexical $_/);
is($_, 'y', '...my $_ restored outside grep');
is(our $_, 'global', '...our $_ restored outside grep');
}
{
sub tgrep3 () { return $_ };
my $_ = 'local';
sub tgrep4 () { return $_ };
my $x = join '-', grep $_=$_.tgrep3.tgrep4, 1 .. 2;
is($x, '1globallocal-2globallocal', 'grep without {} with side-effect');
is($_, 'local', '...but without extraneous side-effects');
}
{
for my $_ (1) {
my $x = grep $_, qw(a b);
is($x, 2, 'grep in scalar context');
}
}
{
my $s = "toto";
my $_ = "titi";
my $r;
{
local $::TODO = 'Marked as todo since test was added in 59f00321bbc2d046';
$r = $s =~ /to(?{ is($_, 'toto', 'my $_ in code-match' ) })to/;
}
ok($r, "\$s=$s should match!");
is(our $_, 'global', '...our $_ restored outside code-match');
}
{
my $_ = "abc";
my $x = reverse;
is($x, "cba", 'reverse without arguments picks up $_');
}
{
package notmain;
our $_ = 'notmain';
::is($::_, 'notmain', 'our $_ forced into main::');
/(.*)/;
::is($1, 'notmain', '...m// defaults to our $_ in main::');
}
my $file = tempfile();
{
open my $_, '>', $file or die "Can't open $file: $!";
print $_ "hello\n";
close $_;
cmp_ok(-s $file, '>', 5, 'writing to filehandle $_ works');
}
{
open my $_, $file or die "Can't open $file: $!";
my $x = <$_>;
is($x, "hello\n", 'reading from <$_> works');
close $_;
}
{
$fqdb::_ = 'fqdb';
is($fqdb::_, 'fqdb', 'fully qualified $_ is not in main' );
is(eval q/$fqdb::_/, 'fqdb', 'fully qualified, evaled $_ is not in main' );
package fqdb;
::isnt($_, 'fqdb', 'unqualified $_ is in main' );
::isnt(eval q/$_/, 'fqdb', 'unqualified, evaled $_ is in main');
}
{
$clank_est::qunckkk = 3;
our $qunckkk;
$qunckkk = 4;
package clank_est;
our $qunckkk;
::is($qunckkk, 3, 'regular variables are not forced to main');
}
{
$whack::_ = 3;
our $_;
$_ = 4;
package whack;
our $_;
::is($_, 4, '$_ is "special", and always forced to main');
}
done_testing();
|