2013-03-21 40 views
0

别名在perl中传递数组参数的含义是什么?下面的代码是否正确?别名在perl中传递数组参数的含义是什么?

#!/usr/bin/perl 

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

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

我不确定你的意思是“别名”。这在Perl中有特定的含义。你能否重写这个问题而不使用单词“别名”?另外,你想完成什么?除非我们知道你想要完成什么,否则我们无法弄清它是否是正确的代码。 – Schwern 2013-03-21 08:21:20

+0

#!/ usr/bin/perl @myarray =(1,2,3,4,5); &my_sub(@myarray); sub my_sub { my(@subarray)= @_; print @subarray; } – baozailove 2013-03-21 08:39:23

+0

我想知道上面的代码在子程序中使用别名方法吗? – baozailove 2013-03-21 08:42:30

回答

0

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

在Perl中,别名可以通过例如任意地创建。 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 APIs imho。

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

my @array = @_; 

做同样的事情

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

打破了所有走样

这实际上被用作Perl中的一种模式来执行“按值调用”并允许限制子例程的副作用。

1

此代码:

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

使使通入子程序阵列的拷贝。如果您想在不修改原始数组的情况下修改子程序中的数组,则这是正确的。

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

+0

谢谢!!但是在subroutie中,如果你在变量的前面添加'my'或'local',原始数组永远不会被修改。 – baozailove 2013-03-21 12:36:08

+0

@baozailove,这里的关键是你正在复制数组到另一个变量。这就是为什么它没有被修改。另外,请注意'my'和'local'是非常不同的。 – 2013-03-21 14:40:23

相关问题