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

and*_*opp 5 perl pass-by-reference

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

FMc*_*FMc 7

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

(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中的类似方法将接收两个不同的参数(两个对象代表列表xy).

(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可以修改xy.但是,接收不可变对象(例如,整数)的函数不会.因此,直接Python模拟add_ten_to_me不起作用.[我相信可以对Ruby做出类似的观点,但我现在对细节不太熟悉.]

  • 我认为#2就是人们通常所说的“按引用传递”。#1 称为传递引用 (2认同)

Que*_*tin 6

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