BEGIN {
chdir 't' if -d 't';
+ @INC = qw(. ../lib);
require './test.pl';
}
-plan tests => 95;
+plan tests => 122;
my $list_assignment_supported = 1;
eval { for("a") { for $x (1,2) { local $_="b"; s/(.*)/+$1/ } } };
is($@, "");
-# Special local() behavior for $[
-# (see RT #38207 - Useless localization of constant ($[) in getopts.pl}
+# RT #4342 Special local() behavior for $[
{
local $[ = 1;
- local $TODO = "local() not currently working correctly with \$[";
- ok(1 == $[);
- undef $TODO;
+ ok(1 == $[, 'lexcical scope of local $[');
f();
}
::ok(f1() eq "f1", "localised sub restored");
::ok(f2() eq "f2", "localised sub restored");
}
+
+# Localising unicode keys (bug #38815)
+{
+ my %h;
+ $h{"\243"} = "pound";
+ $h{"\302\240"} = "octects";
+ is(scalar keys %h, 2);
+ {
+ my $unicode = chr 256;
+ my $ambigous = "\240" . $unicode;
+ chop $ambigous;
+ local $h{$unicode} = 256;
+ local $h{$ambigous} = 160;
+
+ is(scalar keys %h, 4);
+ is($h{"\243"}, "pound");
+ is($h{$unicode}, 256);
+ is($h{$ambigous}, 160);
+ is($h{"\302\240"}, "octects");
+ }
+ is(scalar keys %h, 2);
+ is($h{"\243"}, "pound");
+ is($h{"\302\240"}, "octects");
+}
+
+# And with slices
+{
+ my %h;
+ $h{"\243"} = "pound";
+ $h{"\302\240"} = "octects";
+ is(scalar keys %h, 2);
+ {
+ my $unicode = chr 256;
+ my $ambigous = "\240" . $unicode;
+ chop $ambigous;
+ local @h{$unicode, $ambigous} = (256, 160);
+
+ is(scalar keys %h, 4);
+ is($h{"\243"}, "pound");
+ is($h{$unicode}, 256);
+ is($h{$ambigous}, 160);
+ is($h{"\302\240"}, "octects");
+ }
+ is(scalar keys %h, 2);
+ is($h{"\243"}, "pound");
+ is($h{"\302\240"}, "octects");
+}
+
+# [perl #39012] localizing @_ element then shifting frees element too # soon
+
+{
+ my $x;
+ my $y = bless [], 'X39012';
+ sub X39012::DESTROY { $x++ }
+ sub { local $_[0]; shift }->($y);
+ ok(!$x, '[perl #39012]');
+
+}
+
+# when localising a hash element, the key should be copied, not referenced
+
+{
+ my %h=('k1' => 111);
+ my $k='k1';
+ {
+ local $h{$k}=222;
+
+ is($h{'k1'},222);
+ $k='k2';
+ }
+ ok(! exists($h{'k2'}));
+ is($h{'k1'},111);
+}
+{
+ my %h=('k1' => 111);
+ our $k = 'k1'; # try dynamic too
+ {
+ local $h{$k}=222;
+ is($h{'k1'},222);
+ $k='k2';
+ }
+ ok(! exists($h{'k2'}));
+ is($h{'k1'},111);
+}
+
+# Keep this test last, as it can SEGV
+{
+ local *@;
+ pass("Localised *@");
+ eval {1};
+ pass("Can eval with *@ localised");
+}
+