没有技术理由不允许@array和/或%hash作为子程序的参数.例如:push @list, 1, 2, - 允许.
我们可以通过原型实现这一目标:
mypop (\@)
但同样我们得到数组/哈希作为参考:
sub test (\%\@) {
    my( $hash, $array ) =  @_;
    ...
不允许接下来的历史原因是什么?
my( %hash, @array ) =  @_;
禁止这个有什么好处?
Perl是一种主要面向列表的语言,它区分了单数和复数语境.子例程参数列表是复数上下文.复数上下文中的数组或散列是其值的列表.因此,调用就像foo(@bar)将数组展平为元素一样.这种扁平化允许方便地连接参数列表,例如:
@result = map { $_ * 2 } @nums, 3, 4, return_a_list(), @more_nums;
另请注意,在Perl 5之前,没有可以传递的引用.有数组变量,但不是数组作为第一类值.运算符如push对数组变量进行操作.使用Perl 5,我们有引用,所以我们可以传递包含在标量中的数组引用.重新定义了数组运算符以仍然解析数组变量(或解除引用表达式),但逻辑上对引用进行操作.因此,您可以声明sub mypush(\@@)哪个将接收数组引用作为第一个参数(以尊重此原型的方式调用).
Perl 6使用的方法比Python等语言更为熟悉,其中数组是第一类对象.环境较少,扁平度较低.
| 归档时间: | 
 | 
| 查看次数: | 102 次 | 
| 最近记录: |