Полезно отличать одну вещь от другой.
(1) Передача аргументов в подпрограмму по ссылке . Это полезно в Perl, потому что язык передает все аргументы подпрограмме в виде недифференцированного списка значений . Например, без возможности передавать структуры данных по ссылке разработчик функции, работающей с двумя списками, не сможет хранить списки отдельно. Кроме того, если структуры данных велики, передача их по ссылке может повысить производительность.
process_two_lists( @x, @y); # Can't distinguish the lists.
process_two_lists(\@x, \@y); # Can.
Поскольку Python и Ruby разработаны по-разному, они не требуют этого различия в том, как передаются аргументы. Подобный метод в Python или Ruby получил бы два различных аргумента (два объекта, представляющих списки x
и y
).
(2) Поведение Perl, при котором @_
служит псевдонимом для переданных аргументов, позволяя подпрограмме изменять данные, воспринимаемые вызывающей стороной.
sub add_ten_to_me {
$_[0] += 10;
}
my $x = 1;
add_ten_to_me($x);
say $x; # 11 Amazing!
Python и Ruby также могут делать такие вещи; Тем не менее, есть некоторые квалификации. Python различает изменяемые и неизменные объекты. Если вы передадите что-то изменяемое в метод Python (например, список), метод сможет изменить структуру данных. Таким образом, версия Python process_two_lists
сможет изменять как x
, так и y
. Однако функция, получающая неизменяемые объекты (например, целое число), не будет. Таким образом, прямой аналог Python add_ten_to_me
не будет работать. [Я полагаю, что аналогичные замечания могут быть сделаны в отношении Ruby, но я менее знаком с деталями на данном этапе.]