没有技术理由不允许@array
和/或%hash
作为子例程的参数。例如:push @list, 1, 2
, - 允许。
我们可以通过prototypes实现这一目标:
mypop (\@)
但是我们将所有相同的数组/哈希作为参考:
sub test (\%\@) {
my( $hash, $array ) = @_;
...
不允许接下来的历史原因是什么?
my( %hash, @array ) = @_;
禁止这个有什么好处?
答案 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等语言更为熟悉,其中数组是第一类对象。背景较少,扁平度较低。