0

别名在perl中传递数组参数是什么意思?下面的代码对吗?

#!/usr/bin/perl

@myarray = (1, 2, 3, 4, 5);
&my_sub(@myarray);

sub my_sub {
    my (@subarray) = @_;
    print @subarray;
}
4

2 回答 2

1

这段代码:

sub my_sub {
    my (@subarray) = @_;
    print @subarray;
}

制作传递给子例程的数组的副本。如果您想修改子程序中的数组而不修改原始数组,这是正确的。

在现代 Perl 中调用子例程的正确方法是my_sub(@myarray);. 你不应该使用&.

于 2013-03-21T10:33:59.987 回答
0

术语别名描述了多个名称可以指向相同的数据,而没有引用的句法限制。

在 Perl 中,可以通过 eg 任意Data::Alias创建别名,但是有一些结构可以自己创建别名。

  1. foreach 循环。当前元素是列表中原始元素的别名:

    my @array = 1 .. 5;
    for my $elem (@array) {
       $elem++; # $elem is an alias to $array[$i]
    }
    # the @array is now 2 .. 6.
    
  2. 子程序参数。Perl 子例程用一个平面的标量列表调用(即像散列或数组这样的集合被平面化到这个列表中)。该列表可通过@_数组访问。此数组中的所有元素都是参数的别名。

    sub alias_increment {
      for my $elem (@_) {
         $elem++;
      }
    }
    
    my @array = 1 .. 5;
    alias_increment(@array);
    # array now is 2 .. 6.
    

    请注意,在此示例中,@_不是 的别名@array,而是$_[$i]的别名$array[$i]

    使用这些别名可以让你有争论,但这会导致 akward API 恕我直言。

您还应该注意 Perl 通常具有复制语义。这意味着该语句$foo = $bar通常将数据复制$bar$foo。副本是一个单独的实体,如果原件是别名,则副本本身不会是别名。在列表上下文中复制时,将复制所有元素。这意味着

my @array = @_;

做同样的事情

my @array;
$array[0] = $_[0];
# ...

打破了所有的别名

这实际上在 Perl 中用作“按值调用”的模式,并允许限制子例程的副作用。

于 2013-03-21T12:53:17.690 回答