Мне показалось, что я понял карту, однако следующее дает результаты, которые я не понимаю.Я знаю, почему это происходит, я просто не знаю, как это происходит.
Проблема в том, что содержимое @array изменяется, потому что $_
сбрасывается во время вызова _do_stuff_to_file
.так что печатается here: \nhere:\n
, когда я ожидаю, что оно будет here: donkie\nhere: kong\n
.
Примечание: Это не проверенный код.Это именно то, что я помню из лаборатории.Почему меняется содержимое @array
Если я установил $_
на $f
перед возвратом 1 из _some_func
.Тогда массив все еще не поврежден.
Вот пример программы, иллюстрирующей то, что я вижу:
my @array = ("donkie", "kong");
map { push @junk, _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 !open(FILE, "< $f");
close FILE;
_do_stuff_to_file($f);
return 1;
}
sub _do_stuff_to_file
{
my $f = shift;
open(IN, "< $f");
open(OUT, "> $f.new");
while (<IN>)
{
print OUT;
}
close IN;
close OUT;
}