2013-05-28 44 views
6

我只是看着在懷疑這個順序:perl子例程參數列表 - 「通過別名」?

my $line; 
$rc = getline($line); # read next line and store in $line 

我都明白沿着Perl的論據按值傳遞的,所以每當我需要一個大的結構來傳遞,或傳遞一個變量更新,我已通過裁判。

但是,在perldoc中讀取細小的文字,我知道@_是由別名組成的,它與參數列表中提到的變量相關。讀取下一位數據後,getline()返回$ _ [0] = $ data;,其中存儲$數據直接到$行

我喜歡這樣 - 就像在C++中通過引用傳遞一樣。但是,我還沒有找到一種方法來爲$ _ [0]分配更有意義的名稱。有沒有?

+0

yup,Perl總是通過引用 – newacct

+0

好吧 - 不要與Perl引用混淆,它更像C指針,因爲它們必須被明確解除引用。 – Chap

+0

不會 $ arg = shift; $ arg = $ data; 做到了嗎?或者將'轉移'作爲參數的副本呢? 編輯:我測試了一個通過標量和'shift'ed參數的地址,結果表示shift確實複製,因此如上所述分配給$ arg不會像預期的那樣影響$ line。 :( – sundar

回答

7

可以,它不是很漂亮:

use strict; 
use warnings; 

sub inc { 
    # manipulate the local symbol table 
    # to refer to the alias by $name 
    our $name; local *name = \$_[0]; 

    # $name is an alias to first argument 
    $name++; 
} 

my $x = 1; 
inc($x); 
print $x; # 2 
+1

「Data :: Alias」提供了相當的修飾。 – darch

+0

也是,Method :: Signatures有一個[別名特徵](https://metacpan.org/module/Method::Signatures#Parameter-traits) –

0

最簡單的方法可能只是使用一個循環,因爲循環別名的參數名稱;即

sub my_sub { 
    for my $arg ($_[0]) { 
    code here sees $arg as an alias for $_[0] 
    } 
} 
+0

真的,但不是真正的我以後 - - 理想情況下,希望給每個arg不同的名字。看起來像Joel's那樣做,但正如他所說,這是相當混亂。 – Chap

+0

@Chap:我已經添加了一個答案http:///stackoverflow.com/a/17343595/8127,它允許爲每個arg指定不同的名稱,但這也是以自己的方式混亂。 – sundar

0

的@史蒂夫的代碼的版本允許多個不同的參數:

sub my_sub { 
    SUB: 
    for my $thisarg ($_[0]) { 
    for my $thatarg ($_[1]) { 
     code here sees $thisarg and $thatarg as aliases 
     last SUB; 
    } 
    } 
} 

當然,這帶來了多級嵌套和它自己的代碼的可讀性問題,所以只有當絕對neccessary使用它。