alias在perl中传递数组参数的含义是什么?

时间:2013-03-21 07:57:45

标签: perl

alias在perl中传递数组参数的含义是什么?是对的是以下代码吗?

#!/usr/bin/perl

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

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

2 个答案:

答案 0 :(得分:1)

此代码:

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

创建传递给子例程的数组的副本。如果要修改子例程中的数组而不修改原始数组,这是正确的。

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

答案 1 :(得分:0)

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

在Perl中,别名可以通过例如任意方式创建。 Data::Alias,但有一些构造可以自己创建别名。

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

    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]的别名。

    使用这些别名可以让你拥有out-arguments,但这会产生一些不合时宜的API。

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

    $foo

    做同样的事情
    my @array = @_;
    

    会破坏所有别名

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