2013-03-21 50 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

相關問題