Использование ссылок
Второй, более новый способ передачи массивов в подпрограмму заключается в том, чтобы вместо собственно массивов или хеш-массивов передавать ссылки на них. Ссылка является скалярной величиной и ее легко выделить в массиве параметров @_. Внутри подпрограммы остается только применить к ссылке операцию разыменования для того, чтобы получить доступ к фактическому параметру. Поскольку ссылки появились только в версии Perl 5, то этот способ является относительно новым. При помощи ссылок предыдущий пример можно записать в следующем виде,
sub doublparms {
ray ($listref, $hashref) = @_;
foreach $item (@$listref} { $item *= 2;
} .
foreach $key (keys %$hashref) { $$hashref{$key} *= 2;
} }
@somelist=(1,2,3) ;
%somehash=("one"=>5, "two"=>15, "three"=>20); print "начальные значения:\@somelist=@somelist\n"; foreach $key (keys %somehash) { .
print "\$somehash{$key}=$somehash{$key} "; }
print "\n";
doublparms(\@somelist,\%somehash); print "итоговые значения:\n\@somelist=@somelist\n"; foreach $key (keys %somehash) {
print "\$somehash{$key}=$somehash($key} "; } print "\n";
Здесь для описания локальных переменных использована функция ту. Как мы выяснили ранее в этой главе, применение функции ту в подобном случае реализует передачу параметров по значению. Другими словами, их изменение внутри подпрограммы не влияет на фактические параметры. Каким же образом в данном случае осуществляется передача массива и хеш-массива по ссылке? Дело в том, что по значению передаются только ссылки, указывающие на фактические параметры: массив @someiist и хеш-массив %somehash. Используя операции разыменования внутри подпрограммы, мы получаем доступ непосредственно к массиву @someiist и хеш-массиву %somehash, и изменяем их элементы. В результате выполнения данного сценария будет выведено:
начальные значения:
@somelist=1 2 3
$somehash{one}=5 $somehash{three}=20 $somehash{two}=15
итоговые значения:
@somelist=2 4 6
$somehash{one}=10 $somehash{three)=40 $somehash{two}=30