T
Todd
Hi,
I've met some questions regarding the copy @array or reference inside
for <expr>:
In the code snippets blow, 2 strange cases are using @array copies
rather than modifying original ones:
case5: sub foo1 (\@) { ++$_ for @$_[0] }
case9: sub foo5 (\@) { ++$_ for @{shift} }
Why are they different than others?
--The complete sample codes---
#! /bin/perl -l
{
my @a = 1..5;
++$_ for @a;
print "case1: ", @a;
}
{
my @a = 1..5;
++$_ for @{ \@a };
print "case2: ", @a;
}
{
my @a = 1..5;
my $r = \@a;
++$_ for @$r;
print "case3: ", @a;
}
{
my @a = 1..5;
my $r = \@a;
++$_ for @{$r};
print "case4: ", @a;
}
{
my @a = 1..5;
sub foo1 (\@) { ++$_ for @$_[0] }
foo1 @a;
print "case5: ", @a;
}
{
my @a = 1..5;
sub foo2(\@) { ++$_ for @{$_[0]} }
foo2 @a;
print "case6: ", @a;
}
{
my @a = 1..5;
sub foo3 (\@) { my $r=shift; ++$_ for @$r }
foo3 @a;
print "case7: ", @a;
}
{
my @a = 1..5;
sub foo4 (\@) { my $r=shift; ++$_ for @{$r} }
foo4 @a;
print "case8: ", @a;
}
{
my @a = 1..5;
sub foo5 (\@) { ++$_ for @{shift} }
foo5 @a;
print "case9: ", @a;
}
__END__
case1: 23456
case2: 23456
case3: 23456
case4: 23456
case5: 12345
case6: 23456
case7: 23456
case8: 23456
case9: 12345
-Todd
I've met some questions regarding the copy @array or reference inside
for <expr>:
In the code snippets blow, 2 strange cases are using @array copies
rather than modifying original ones:
case5: sub foo1 (\@) { ++$_ for @$_[0] }
case9: sub foo5 (\@) { ++$_ for @{shift} }
Why are they different than others?
--The complete sample codes---
#! /bin/perl -l
{
my @a = 1..5;
++$_ for @a;
print "case1: ", @a;
}
{
my @a = 1..5;
++$_ for @{ \@a };
print "case2: ", @a;
}
{
my @a = 1..5;
my $r = \@a;
++$_ for @$r;
print "case3: ", @a;
}
{
my @a = 1..5;
my $r = \@a;
++$_ for @{$r};
print "case4: ", @a;
}
{
my @a = 1..5;
sub foo1 (\@) { ++$_ for @$_[0] }
foo1 @a;
print "case5: ", @a;
}
{
my @a = 1..5;
sub foo2(\@) { ++$_ for @{$_[0]} }
foo2 @a;
print "case6: ", @a;
}
{
my @a = 1..5;
sub foo3 (\@) { my $r=shift; ++$_ for @$r }
foo3 @a;
print "case7: ", @a;
}
{
my @a = 1..5;
sub foo4 (\@) { my $r=shift; ++$_ for @{$r} }
foo4 @a;
print "case8: ", @a;
}
{
my @a = 1..5;
sub foo5 (\@) { ++$_ for @{shift} }
foo5 @a;
print "case9: ", @a;
}
__END__
case1: 23456
case2: 23456
case3: 23456
case4: 23456
case5: 12345
case6: 23456
case7: 23456
case8: 23456
case9: 12345
-Todd