修改$ _會改變你的初始陣列,因爲$ _是一個別名到當前元素。您的代碼應如下所示:
my @array = ("donkie", "kong");
my @junk=map {_some_func('blah', $_) } @array;
if (join ('', @junk) !~ /0/)
{ # for example sake this is always true since return 1 from _some_func.
print map { "here: $_\n"; } @array;
}
sub _some_func
{ # for example sake, lets say $f always exists as a file.
my $j = shift;
my $f = shift;
return 0 if !-e $f;
_do_stuff_to_file($f);
return 1;
}
sub _do_stuff_to_file
{
my $f = shift;
local $_;
open(IN, "<",$f);
open(OUT, ">", "$f.new");
while (<IN>)
{
print OUT;
}
close IN;
close OUT;
}
P.S. map返回具有相同元素數量的數組(如果標量是從塊返回的)。 grep只返回block爲true的元素。
您的問題已經包含了自己的答案 - 您已經解釋了它是如何發生的。你是否想改變你的問題到「我該如何避免讓東西暴露$ _'?因爲那是我們可以回答的問題(而且邁克爾卡爾曼已經有了) – hobbs 2010-08-21 22:02:05
我同意hobbs提出的問題標題@yesterday Could you更改它? – dolmen 2010-08-23 10:03:10