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

时间:2011-05-13 10:34:05

标签: perl pass-by-reference

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

3 个答案:

答案 0 :(得分:7)

将一件事与另一件事区分开是有用的。

(1)通过引用将参数传递给子例程。这在Perl中很有用,因为该语言将所有参数作为未区分的值列表传递给子例程。如果没有通过引用传递数据结构的能力,例如,采用两个列表的函数的设计者将无法将列表分开。此外,如果数据结构很大,通过引用传递它们可以提供性能增益。

process_two_lists( @x,  @y); # Can't distinguish the lists.
process_two_lists(\@x, \@y); # Can.

由于Python和Ruby的设计不同,因此它们不需要在传递参数方面进行区分。 Python或Ruby中的类似方法将接收两个不同的参数(两个对象代表列表xy)。

(2)Perl的行为,@_作为传递参数的别名,允许子程序修改调用者所感知的数据。

sub add_ten_to_me {
    $_[0] += 10;
}

my $x = 1;
add_ten_to_me($x);
say $x;            # 11  Amazing!

Python和Ruby也可以做这类事情;但是,有一些资格。 Python区分 mutable immutable 对象。如果将可变的内容传递给Python方法(例如,列表),则该方法可以修改数据结构。因此,process_two_lists的Python版本可以修改xy。但是,接收不可变对象(例如,整数)的函数不会。因此,add_ten_to_me的直接Python模拟不起作用。 [我相信可以对Ruby做出类似的观点,但我现在对细节不太熟悉。]

答案 1 :(得分:6)

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

答案 2 :(得分:4)

Perl为您提供了选择。我认为这是TIMTOWTDI想法的一部分。这是一种灵活的方法,因此您可以做您需要的。如果您将参数作为$_[0]访问,那么它就是同一个对象。如果你将它移动或复制到词汇,它是按值。

所以这样想吧。大多数代码都是按值计算的,但是在您需要时可以参考。