and*_*opp 5 perl pass-by-reference
我想知道为什么Perl能够通过引用函数传递参数?我知道Python和Ruby都没有这样的功能.
将一件事与另一件事区分开来是有用的.
(1)通过引用将参数传递给子例程.这在Perl中很有用,因为该语言将所有参数作为未分化的值列表传递给子例程.如果没有通过引用传递数据结构的能力,例如,采用两个列表的函数的设计者将无法将列表分开.此外,如果数据结构很大,通过引用传递它们可以提供性能增益.
process_two_lists( @x, @y); # Can't distinguish the lists.
process_two_lists(\@x, \@y); # Can.
Run Code Online (Sandbox Code Playgroud)
因为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!
Run Code Online (Sandbox Code Playgroud)
Python和Ruby也可以做这类事情; 但是,有一些资格.Python区分了可变对象和不可变对象.如果将可变的内容传递给Python方法(例如,列表),则该方法可以修改数据结构.所以Python版本process_two_lists可以修改x和y.但是,接收不可变对象(例如,整数)的函数不会.因此,直接Python模拟add_ten_to_me不起作用.[我相信可以对Ruby做出类似的观点,但我现在对细节不太熟悉.]