Долгое время я всегда думал, что параметры в сабвуферах Perl передаются по значению. Теперь я столкнулся с чем-то, чего я не понимаю:
use strict;
use warnings;
use Data::Dumper;
sub p {
print STDERR "Before match: " . Data::Dumper->Dump([[@_]]) . "\n";
"1" =~ /1/;
print STDERR "After match: " . Data::Dumper->Dump([[@_]]) . "\n";
}
my $line = "jojo.tsv.bz2";
if ($line =~ /\.([a-z0-9]+)(?:\.(bz2|gz|7z|zip))?$/i) {
p($1, $2 || 'none');
p([$1, $2 || 'none']);
}
При первом вызове p () и после выполнения соответствия регулярному выражению значения в @_ станут undefs. При втором вызове все в порядке (значения, переданные в качестве ссылки на массив, не затрагиваются).
Это было протестировано с версиями Perl 5.8.8 (CentOS 5.6) и 5.12.3 (Fedora 14).
Вопрос в том, как это могло случиться, что соответствие регулярному выражению уничтожает содержимое @_, которое было построено с использованием $ 1, $ 2 и т. Д. (Другие значения, если вы их добавите, не затрагиваются)?