xref: /openbsd/gnu/usr.bin/perl/t/op/mydef.t (revision 8932bfb7)
1#!./perl
2
3BEGIN {
4    chdir 't' if -d 't';
5    @INC = '../lib';
6    require './test.pl';
7}
8
9print "1..72\n";
10
11my $test = 0;
12sub ok ($@) {
13    my ($ok, $name) = @_;
14    ++$test;
15    print $ok ? "ok $test - $name\n" : "not ok $test - $name\n";
16}
17
18$_ = 'global';
19ok( $_ eq 'global', '$_ initial value' );
20s/oba/abo/;
21ok( $_ eq 'glabol', 's/// on global $_' );
22
23{
24    my $_ = 'local';
25    ok( $_ eq 'local', 'my $_ initial value' );
26    s/oca/aco/;
27    ok( $_ eq 'lacol', 's/// on my $_' );
28    /(..)/;
29    ok( $1 eq 'la', '// on my $_' );
30    ok( tr/c/d/ == 1, 'tr/// on my $_ counts correctly' );
31    ok( $_ eq 'ladol', 'tr/// on my $_' );
32    {
33	my $_ = 'nested';
34	ok( $_ eq 'nested', 'my $_ nested' );
35	chop;
36	ok( $_ eq 'neste', 'chop on my $_' );
37    }
38    {
39	our $_;
40	ok( $_ eq 'glabol', 'gains access to our global $_' );
41    }
42    ok( $_ eq 'ladol', 'my $_ restored' );
43}
44ok( $_ eq 'glabol', 'global $_ restored' );
45s/abo/oba/;
46ok( $_ eq 'global', 's/// on global $_ again' );
47{
48    my $_ = 11;
49    our $_ = 22;
50    ok( $_ eq 22, 'our $_ is seen explicitly' );
51    chop;
52    ok( $_ eq 2, '...default chop chops our $_' );
53    /(.)/;
54    ok( $1 eq 2, '...default match sees our $_' );
55}
56
57$_ = "global";
58{
59    my $_ = 'local';
60    for my $_ ("foo") {
61	ok( $_ eq "foo", 'for my $_' );
62	/(.)/;
63	ok( $1 eq "f", '...m// in for my $_' );
64	ok( our $_ eq 'global', '...our $_ inside for my $_' );
65    }
66    ok( $_ eq 'local', '...my $_ restored outside for my $_' );
67    ok( our $_ eq 'global', '...our $_ restored outside for my $_' );
68}
69{
70    my $_ = 'local';
71    for ("implicit foo") { # implicit "my $_"
72	ok( $_ eq "implicit foo", 'for implicit my $_' );
73	/(.)/;
74	ok( $1 eq "i", '...m// in for implicity my $_' );
75	ok( our $_ eq 'global', '...our $_ inside for implicit my $_' );
76    }
77    ok( $_ eq 'local', '...my $_ restored outside for implicit my $_' );
78    ok( our $_ eq 'global', '...our $_ restored outside for implicit my $_' );
79}
80{
81    my $_ = 'local';
82    ok( $_ eq "postfix foo", 'postfix for' ) for 'postfix foo';
83    ok( $_ eq 'local', '...my $_ restored outside postfix for' );
84    ok( our $_ eq 'global', '...our $_ restored outside postfix for' );
85}
86{
87    for our $_ ("bar") {
88	ok( $_ eq "bar", 'for our $_' );
89	/(.)/;
90	ok( $1 eq "b", '...m// in for our $_' );
91    }
92    ok( $_ eq 'global', '...our $_ restored outside for our $_' );
93}
94
95{
96    my $buf = '';
97    sub tmap1 { /(.)/; $buf .= $1 } # uses our $_
98    my $_ = 'x';
99    sub tmap2 { /(.)/; $buf .= $1 } # uses my $_
100    map {
101	tmap1();
102	tmap2();
103	ok( /^[67]\z/, 'local lexical $_ is seen in map' );
104	{ ok( our $_ eq 'global', 'our $_ still visible' ); }
105	ok( $_ == 6 || $_ == 7, 'local lexical $_ is still seen in map' );
106	{ my $_ ; ok( !defined, 'nested my $_ is undefined' ); }
107    } 6, 7;
108    ok( $buf eq 'gxgx', q/...map doesn't modify outer lexical $_/ );
109    ok( $_ eq 'x', '...my $_ restored outside map' );
110    ok( our $_ eq 'global', '...our $_ restored outside map' );
111    map { my $_; ok( !defined, 'redeclaring $_ in map block undefs it' ); } 1;
112}
113{ map { my $_; ok( !defined, 'declaring $_ in map block undefs it' ); } 1; }
114{
115    sub tmap3 () { return $_ };
116    my $_ = 'local';
117    sub tmap4 () { return $_ };
118    my $x = join '-', map $_.tmap3.tmap4, 1 .. 2;
119    ok( $x eq '1globallocal-2globallocal', 'map without {}' );
120}
121{
122    for my $_ (1) {
123	my $x = map $_, qw(a b);
124	ok( $x == 2, 'map in scalar context' );
125    }
126}
127{
128    my $buf = '';
129    sub tgrep1 { /(.)/; $buf .= $1 }
130    my $_ = 'y';
131    sub tgrep2 { /(.)/; $buf .= $1 }
132    grep {
133	tgrep1();
134	tgrep2();
135	ok( /^[89]\z/, 'local lexical $_ is seen in grep' );
136	{ ok( our $_ eq 'global', 'our $_ still visible' ); }
137	ok( $_ == 8 || $_ == 9, 'local lexical $_ is still seen in grep' );
138    } 8, 9;
139    ok( $buf eq 'gygy', q/...grep doesn't modify outer lexical $_/ );
140    ok( $_ eq 'y', '...my $_ restored outside grep' );
141    ok( our $_ eq 'global', '...our $_ restored outside grep' );
142}
143{
144    sub tgrep3 () { return $_ };
145    my $_ = 'local';
146    sub tgrep4 () { return $_ };
147    my $x = join '-', grep $_=$_.tgrep3.tgrep4, 1 .. 2;
148    ok( $x eq '1globallocal-2globallocal', 'grep without {} with side-effect' );
149    ok( $_ eq 'local', '...but without extraneous side-effects' );
150}
151{
152    for my $_ (1) {
153	my $x = grep $_, qw(a b);
154	ok( $x == 2, 'grep in scalar context' );
155    }
156}
157{
158    my $s = "toto";
159    my $_ = "titi";
160    $s =~ /to(?{ ok( $_ eq 'toto', 'my $_ in code-match # TODO' ) })to/
161	or ok( 0, "\$s=$s should match!" );
162    ok( our $_ eq 'global', '...our $_ restored outside code-match' );
163}
164
165{
166    my $_ = "abc";
167    my $x = reverse;
168    ok( $x eq "cba", 'reverse without arguments picks up $_' );
169}
170
171{
172    package notmain;
173    our $_ = 'notmain';
174    ::ok( $::_ eq 'notmain', 'our $_ forced into main::' );
175    /(.*)/;
176    ::ok( $1 eq 'notmain', '...m// defaults to our $_ in main::' );
177}
178
179my $file = tempfile();
180{
181    open my $_, '>', $file or die "Can't open $file: $!";
182    print $_ "hello\n";
183    close $_;
184    ok( -s $file, 'writing to filehandle $_ works' );
185}
186{
187    open my $_, $file or die "Can't open $file: $!";
188    my $x = <$_>;
189    ok( $x eq "hello\n", 'reading from <$_> works' );
190    close $_;
191}
192
193{
194    $fqdb::_ = 'fqdb';
195    ok( $fqdb::_ eq 'fqdb', 'fully qualified $_ is not in main' );
196    ok( eval q/$fqdb::_/ eq 'fqdb', 'fully qualified, evaled $_ is not in main' );
197    package fqdb;
198    ::ok( $_ ne 'fqdb', 'unqualified $_ is in main' );
199    ::ok( q/$_/ ne 'fqdb', 'unqualified, evaled $_ is in main' );
200}
201
202{
203    $clank_est::qunckkk = 3;
204    our $qunckkk;
205    $qunckkk = 4;
206    package clank_est;
207    our $qunckkk;
208    ::ok($qunckkk == 3, 'regular variables are not forced to main');
209}
210
211{
212    $whack::_ = 3;
213    our $_;
214    $_ = 4;
215    package whack;
216    our $_;
217    ::ok($_ == 4, '$_ is "special", and always forced to main');
218}
219