Check strict vars functionality __END__ # no strict, should build & run ok. Fred ; my $fred ; $b = "fred" ; $a = $$b ; EXPECT ######## use strict qw(subs refs) ; $fred ; EXPECT ######## use strict ; no strict 'vars' ; $fred ; EXPECT ######## # strict vars - no error use strict 'vars' ; use vars qw( $freddy) ; BEGIN { *freddy = \$joe::shmoe; } $freddy = 2 ; EXPECT ######## # strict vars - no error use strict 'vars' ; use vars qw( $freddy) ; local $abc::joe ; my $fred ; my $b = \$fred ; $Fred::ABC = 1 ; $freddy = 2 ; EXPECT ######## # strict vars - error use strict ; $fred ; EXPECT Global symbol "$fred" requires explicit package name (did you forget to declare "my $fred"?) at - line 4. Execution of - aborted due to compilation errors. ######## # strict vars - error use strict 'vars' ; <$fred> ; EXPECT Global symbol "$fred" requires explicit package name (did you forget to declare "my $fred"?) at - line 4. Execution of - aborted due to compilation errors. ######## # strict vars - error use strict 'vars' ; local $fred ; EXPECT Global symbol "$fred" requires explicit package name (did you forget to declare "my $fred"?) at - line 4. Execution of - aborted due to compilation errors. ######## # Check compile time scope of strict vars pragma use strict 'vars' ; { no strict ; $joe = 1 ; } $joe = 1 ; EXPECT Variable "$joe" is not imported at - line 8. Global symbol "$joe" requires explicit package name (did you forget to declare "my $joe"?) at - line 8. Execution of - aborted due to compilation errors. ######## # Check compile time scope of strict vars pragma use strict 'vars' ; use utf8; use open qw( :utf8 :std ); { no strict ; $jòè = 1 ; } $jòè = 1 ; EXPECT Variable "$jòè" is not imported at - line 10. Global symbol "$jòè" requires explicit package name (did you forget to declare "my $jòè"?) at - line 10. Execution of - aborted due to compilation errors. ######## # Check compile time scope of strict vars pragma no strict; { use strict 'vars' ; $joe = 1 ; } $joe = 1 ; EXPECT Global symbol "$joe" requires explicit package name (did you forget to declare "my $joe"?) at - line 6. Execution of - aborted due to compilation errors. ######## --FILE-- abc $joe = 1 ; 1; --FILE-- use strict 'vars' ; require "./abc"; EXPECT ######## --FILE-- abc use strict 'vars' ; 1; --FILE-- require "./abc"; $joe = 1 ; EXPECT ######## --FILE-- abc use strict 'vars' ; $joe = 1 ; 1; --FILE-- $joe = 1 ; require "./abc"; EXPECT Variable "$joe" is not imported at ./abc line 2. Global symbol "$joe" requires explicit package name (did you forget to declare "my $joe"?) at ./abc line 2. Compilation failed in require at - line 2. ######## --FILE-- abc use strict 'vars' ; use utf8; use open qw( :utf8 :std ); $jòè = 1 ; 1; --FILE-- use utf8; use open qw( :utf8 :std ); $jòè = 1 ; require "./abc"; EXPECT Variable "$jòè" is not imported at ./abc line 4. Global symbol "$jòè" requires explicit package name (did you forget to declare "my $jòè"?) at ./abc line 4. Compilation failed in require at - line 4. ######## --FILE-- abc.pm use strict 'vars' ; $joe = 1 ; 1; --FILE-- $joe = 1 ; use abc; EXPECT Variable "$joe" is not imported at abc.pm line 2. Global symbol "$joe" requires explicit package name (did you forget to declare "my $joe"?) at abc.pm line 2. Compilation failed in require at - line 2. BEGIN failed--compilation aborted at - line 2. ######## --FILE-- abc.pm use strict 'vars' ; use utf8; use open qw( :utf8 :std ); $jòè = 1 ; 1; --FILE-- use utf8; use open qw( :utf8 :std ); $jòè = 1 ; use abc; EXPECT Variable "$jòè" is not imported at abc.pm line 4. Global symbol "$jòè" requires explicit package name (did you forget to declare "my $jòè"?) at abc.pm line 4. Compilation failed in require at - line 4. BEGIN failed--compilation aborted at - line 4. ######## --FILE-- abc.pm package Burp; use strict; $a = 1;$f = 1;$k = 1; # just to get beyond the limit... $b = 1;$g = 1;$l = 1; $c = 1;$h = 1;$m = 1; $d = 1;$i = 1;$n = 1; $e = 1;$j = 1;$o = 1; $p = 0b12; --FILE-- use abc; EXPECT Global symbol "$f" requires explicit package name (did you forget to declare "my $f"?) at abc.pm line 3. Global symbol "$k" requires explicit package name (did you forget to declare "my $k"?) at abc.pm line 3. Global symbol "$g" requires explicit package name (did you forget to declare "my $g"?) at abc.pm line 4. Global symbol "$l" requires explicit package name (did you forget to declare "my $l"?) at abc.pm line 4. Global symbol "$c" requires explicit package name (did you forget to declare "my $c"?) at abc.pm line 5. Global symbol "$h" requires explicit package name (did you forget to declare "my $h"?) at abc.pm line 5. Global symbol "$m" requires explicit package name (did you forget to declare "my $m"?) at abc.pm line 5. Global symbol "$d" requires explicit package name (did you forget to declare "my $d"?) at abc.pm line 6. Global symbol "$i" requires explicit package name (did you forget to declare "my $i"?) at abc.pm line 6. Global symbol "$n" requires explicit package name (did you forget to declare "my $n"?) at abc.pm line 6. Global symbol "$e" requires explicit package name (did you forget to declare "my $e"?) at abc.pm line 7. Global symbol "$j" requires explicit package name (did you forget to declare "my $j"?) at abc.pm line 7. Global symbol "$o" requires explicit package name (did you forget to declare "my $o"?) at abc.pm line 7. Global symbol "$p" requires explicit package name (did you forget to declare "my $p"?) at abc.pm line 8. Illegal binary digit '2' at abc.pm line 8, at end of line abc.pm has too many errors. Compilation failed in require at - line 1. BEGIN failed--compilation aborted at - line 1. ######## # Check scope of pragma with eval no strict ; eval { $joe = 1 ; }; print STDERR $@; $joe = 1 ; EXPECT ######## # Check scope of pragma with eval no strict ; eval { use strict 'vars' ; $joe = 1 ; }; print STDERR $@; $joe = 1 ; EXPECT Global symbol "$joe" requires explicit package name (did you forget to declare "my $joe"?) at - line 6. Execution of - aborted due to compilation errors. ######## # Check scope of pragma with eval use strict 'vars' ; eval { $joe = 1 ; }; print STDERR $@; $joe = 1 ; EXPECT Global symbol "$joe" requires explicit package name (did you forget to declare "my $joe"?) at - line 5. Global symbol "$joe" requires explicit package name (did you forget to declare "my $joe"?) at - line 8. Execution of - aborted due to compilation errors. ######## # Check scope of pragma with eval use strict 'vars' ; eval { no strict ; $joe = 1 ; }; print STDERR $@; $joe = 1 ; EXPECT Variable "$joe" is not imported at - line 9. Global symbol "$joe" requires explicit package name (did you forget to declare "my $joe"?) at - line 9. Execution of - aborted due to compilation errors. ######## # Check scope of pragma with eval use strict 'vars' ; use utf8; use open qw( :utf8 :std ); eval { no strict ; $jòè = 1 ; }; print STDERR $@; $jòè = 1 ; EXPECT Variable "$jòè" is not imported at - line 11. Global symbol "$jòè" requires explicit package name (did you forget to declare "my $jòè"?) at - line 11. Execution of - aborted due to compilation errors. ######## # Check scope of pragma with eval no strict ; eval ' $joe = 1 ; '; print STDERR $@ ; $joe = 1 ; EXPECT ######## # Check scope of pragma with eval no strict ; eval q[ use strict 'vars' ; $joe = 1 ; ]; print STDERR $@; EXPECT Global symbol "$joe" requires explicit package name (did you forget to declare "my $joe"?) at (eval 1) line 3. ######## # Check scope of pragma with eval use strict 'vars' ; eval ' $joe = 1 ; '; print STDERR $@ ; EXPECT Global symbol "$joe" requires explicit package name (did you forget to declare "my $joe"?) at (eval 1) line 2. ######## # Check scope of pragma with eval use strict 'vars' ; eval ' no strict ; $joe = 1 ; '; print STDERR $@; $joe = 1 ; EXPECT Global symbol "$joe" requires explicit package name (did you forget to declare "my $joe"?) at - line 8. Execution of - aborted due to compilation errors. ######## # Check if multiple evals produce same errors use strict 'vars'; my $ret = eval q{ print $x; }; print $@; print "ok 1\n" unless defined $ret; $ret = eval q{ print $x; }; print $@; print "ok 2\n" unless defined $ret; EXPECT Global symbol "$x" requires explicit package name (did you forget to declare "my $x"?) at (eval 1) line 1. ok 1 Global symbol "$x" requires explicit package name (did you forget to declare "my $x"?) at (eval 2) line 1. ok 2 ######## # strict vars with outer our - no error use strict 'vars' ; our $freddy; local $abc::joe ; my $fred ; my $b = \$fred ; $Fred::ABC = 1 ; $freddy = 2 ; EXPECT ######## # strict vars with inner our - no error use strict 'vars' ; sub foo { our $fred; $fred; } EXPECT ######## # strict vars with outer our, inner use - no error use strict 'vars' ; our $fred; sub foo { $fred; } EXPECT ######## # strict vars with nested our - no error use strict 'vars' ; our $fred; sub foo { our $fred; $fred; } $fred ; EXPECT ######## # strict vars with elapsed our - error use strict 'vars' ; sub foo { our $fred; $fred; } $fred ; EXPECT Variable "$fred" is not imported at - line 8. Global symbol "$fred" requires explicit package name (did you forget to declare "my $fred"?) at - line 8. Execution of - aborted due to compilation errors. ######## # strict vars with elapsed our - error use strict 'vars' ; use utf8; use open qw( :utf8 :std ); sub fòò { our $frèd; $frèd; } $frèd ; EXPECT Variable "$frèd" is not imported at - line 10. Global symbol "$frèd" requires explicit package name (did you forget to declare "my $frèd"?) at - line 10. Execution of - aborted due to compilation errors. ######## # nested our with local - no error $fred = 1; use strict 'vars'; { local our $fred = 2; print $fred,"\n"; } print our $fred,"\n"; EXPECT 2 1 ######## # "nailed" our declaration visibility across package boundaries use strict 'vars'; our $foo; $foo = 20; package Foo; print $foo, "\n"; EXPECT 20 ######## # multiple our declarations in same scope, different packages, no warning use strict 'vars'; use warnings; our $foo; ${foo} = 10; package Foo; our $foo = 20; print $foo, "\n"; EXPECT 20 ######## # multiple our declarations in same scope, same package, warning use strict 'vars'; use warnings; our $foo; ${foo} = 10; our $foo; EXPECT "our" variable $foo redeclared at - line 7. ######## # multiple our declarations in same scope, same package, warning use strict 'vars'; use warnings; { our $x = 1 } { our $x = 0 } our $foo; { our $foo; our $foo; package Foo; our $foo; } EXPECT "our" variable $foo redeclared at - line 9. (Did you mean "local" instead of "our"?) "our" variable $foo redeclared at - line 10. ######## --FILE-- abc ok --FILE-- # check if our variables are introduced correctly in readline() package Foo; use strict 'vars'; our $FH; open $FH, "abc" or die "Can't open 'abc': $!"; print <$FH>; close $FH; EXPECT ok ######## # Make sure the strict vars failure still occurs # now that the '@i should be written as \@i' failure does not occur # 20000522 mjd@plover.com (MJD) use strict 'vars'; no warnings; "@i_like_crackers"; EXPECT Global symbol "@i_like_crackers" requires explicit package name (did you forget to declare "my @i_like_crackers"?) at - line 7. Execution of - aborted due to compilation errors. ######## # [perl #21914] New bug > 5.8.0. Used to dump core. use strict 'vars'; @k = <$k>; EXPECT Global symbol "@k" requires explicit package name (did you forget to declare "my @k"?) at - line 4. Global symbol "$k" requires explicit package name (did you forget to declare "my $k"?) at - line 4. Execution of - aborted due to compilation errors. ######## # [perl #26910] hints not propagated into (?{...}) use strict 'vars'; qr/(?{$foo++})/; EXPECT Global symbol "$foo" requires explicit package name (did you forget to declare "my $foo"?) at - line 3. Execution of - aborted due to compilation errors. ######## # Regex compilation errors weren't UTF-8 clean. use strict 'vars'; use utf8; use open qw( :utf8 :std ); qr/(?{$fòò++})/; EXPECT Global symbol "$fòò" requires explicit package name (did you forget to declare "my $fòò"?) at - line 5. Execution of - aborted due to compilation errors. ######## # [perl #73712] 'Variable is not imported' should be suppressible $dweck; use strict 'vars'; no warnings; eval q/$dweck/; EXPECT ######## # [perl #112316] strict vars getting confused by nulls # Assigning to a package whose name contains a null BEGIN { *Foo:: = *{"foo\0bar::"} } package foo; *Foo::bar = []; use strict; eval 'package Foo; @bar = 1' or die; EXPECT ######## # [perl #112316] strict vars getting confused by nulls # Assigning from within a package whose name contains a null BEGIN { *Foo:: = *{"foo\0bar::"} } package Foo; *foo::bar = []; use strict; eval 'package foo; @bar = 1' or die; EXPECT ######## # [perl #112316] strict vars getting confused by nulls # Assigning from one null package to another, with a common prefix BEGIN { *Foo:: = *{"foo\0foo::"}; *Bar:: = *{"foo\0bar::"} } package Foo; *Bar::bar = []; use strict; eval 'package Bar; @bar = 1' or die; EXPECT ######## # UTF8 and Latin1 package names equivalent at the byte level use utf8; # ĵ in UTF-8 is the same as ĵ in Latin-1 package ĵ; *ĵ::bar = []; use strict; eval 'package ĵ; @bar = 1' or die; EXPECT