为什么Perl允许通过引用传递参数?

为什么Perl允许通过引用传递参数?,perl,pass-by-reference,Perl,Pass By Reference,我想知道为什么Perl能够通过引用将参数传递给函数? 我知道Python和Ruby都没有这样的功能。通过引用传递参数可以显著提高性能。区分不同的东西很有用 (1) 通过引用将参数传递给子例程。这在Perl中很有用,因为该语言将所有参数作为未区分的值列表传递给子例程。如果没有通过引用传递数据结构的能力,例如,使用两个列表的函数的设计者将无法保持列表的独立性。此外,如果数据结构很大,通过引用传递它们可以提高性能 process_two_lists( @x, @y); # Can't disting

我想知道为什么Perl能够通过引用将参数传递给函数?
我知道Python和Ruby都没有这样的功能。

通过引用传递参数可以显著提高性能。

区分不同的东西很有用

(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\u two\u列表
可以同时修改
x
y
。但是,接收不可变对象(例如,整数)的函数不会。因此,
add_ten_to_me
的直接Python模拟将不起作用。[我相信关于Ruby也可以提出类似的观点,但我不太熟悉这一点的细节。]

Perl为您提供了选择。我认为这是TIMTOWTDI想法的一部分。这是一个灵活的方法,所以你可以做你需要的。如果以
$\u0]
的形式访问参数,则它是同一个对象。如果你移动它或将它复制到一个词汇表中,它是按值计算的


所以这样想吧。大多数代码都是按值传递的,但当您需要时,引用就在那里。

您是指隐式传递引用还是显式传递引用?也许可以举一个例子来说明您的意思。为什么要忽略通过引用传递参数的功能?似乎包含别名的
@
是一个偶然的特性,早在Perl 3天的时候,人们就开始依赖它,或者可能是
for
的时候。对p5p存档和git repo的搜索结果为空,但@tchrist或@merlyn将知道答案。@TLP,我的意思是用反斜杠
\
@Dave Sherohman预加变量,我认为这是一种非常错误的编程方法——读取可以在函数调用中重新绑定外部函数变量名的代码更加困难。我认为#2是人们通常所说的“通过引用传递”#1被称为传递引用