in reply to Difference my and local
my variables are statically bound.
sub test_a { my $var = "Hello World\n"; } sub test_b { print($var); # XXX Doesn't print Hello World. } test_a(); print($var); # Doesn't print Hello World.
local variables are dynamically bound.
sub test_a { local $var = "Hello World\n"; } sub test_b { print($var); # Prints Hello World. } test_a(); print($var); # Doesn't print Hello World.
However, dynamic binding is rarely used, because its use leads to fragile software. In Perl, local is mostly used to assign a new value to a builtin global, while automatically restoring the global's value when the block is exited.
sub test { $_ = $_[0]; s/([a-z])/uc($1)/eg; return $_; } foreach (qw(a b c)) { print(test($_), "\n"); } $ perl script.pl Modification of a read-only value attempted at script.pl line 3.
It's trying to modify the constant 'a', since $_ is a reference to it. Fix:
sub test { local $_ = $_[0]; s/([a-z])/uc($1)/eg; return $_; } foreach (qw(a b c)) { print(test($_), "\n"); } $ perl script.pl A B C
|
|---|