为什么perl不允许子例程的%hash,@ array参数?

时间:2018-02-16 12:42:18

标签: perl

没有技术理由不允许@array和/或%hash作为子例程的参数。例如:push @list, 1, 2, - 允许。

我们可以通过prototypes实现这一目标:

mypop (\@)

但是我们将所有相同的数组/哈希作为参考:

sub test (\%\@) {
    my( $hash, $array ) =  @_;
    ...

不允许接下来的历史原因是什么?

my( %hash, @array ) =  @_;

禁止这个有什么好处?

1 个答案:

答案 0 :(得分:7)

Perl是一种主要面向列表的语言,它区分单数和复数语境。子例程参数列表是复数上下文。复数上下文中的数组或散列是其值的列表。因此像foo(@bar)这样的调用会将数组展平为其元素。这种扁平化允许方便地连接参数列表,例如:

@result = map { $_ * 2 } @nums, 3, 4, return_a_list(), @more_nums;

另请注意,在Perl 5之前,没有可以传递的引用。有数组变量,但不是数组作为第一类值。诸如push之类的运算符对数组变量进行操作。使用Perl 5,我们有引用,所以我们可以传递包含在标量中的数组引用。重新定义了数组运算符以仍然解析数组变量(或解除引用表达式),但逻辑上对引用进行操作。因此,您可以声明sub mypush(\@@)将接收数组引用作为第一个参数(以尊重此原型的方式调用时)。

Perl 6使用的方法比Python等语言更为熟悉,其中数组是第一类对象。背景较少,扁平度较低。