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

Eug*_*kov 0 perl

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

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

mypop (\@)
Run Code Online (Sandbox Code Playgroud)

但同样我们得到数组/哈希作为参考:

sub test (\%\@) {
    my( $hash, $array ) =  @_;
    ...
Run Code Online (Sandbox Code Playgroud)

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

my( %hash, @array ) =  @_;
Run Code Online (Sandbox Code Playgroud)

禁止这个有什么好处?

amo*_*mon 7

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

@result = map { $_ * 2 } @nums, 3, 4, return_a_list(), @more_nums;
Run Code Online (Sandbox Code Playgroud)

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

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