2013-08-22 50 views
1

我想清楚我對以下內容的理解。
假設我有一個Perl模塊,其中包含一個需要3個參數的函數。
例如在功能中:
my ($a, $b, $c) = @_;Perl中有方法的簽名嗎?

現在這個函數被2個不同的其他腳本調用。
其中一個腳本需要一些「附加」功能。如果我通過一些例如該功能的2個額外參數例如
my ($a, $b, $c, $d, $e) = @_;並使用它們,如果它們被定義,這不會造成任何問題嗎?
我主要關心的是,perl中沒有函數簽名或類似的權限?所以我可以通過任何參數

+4

'$ a'和'$ b'保留給'sort'。你不應該使用這兩個名字,因爲它們可能會發生衝突。 – simbabque

+0

@simbabque:名稱是一個例子,但很高興知道! – Jim

回答

3

您可以根據需要傳遞任意數量的參數。所有你不分配的都不會被使用。在您使用的作業表格中,他們只會保留在@_中。

sub foo { 
    my ($a, $b, $c) = @_; 
} 

foo(1, 2, 3, 4); 

在這種情況下,4將永遠不會被分配給一個變量,但它仍然是存在的。

如果您將它稱爲foo(1, 2),那也不會造成任何傷害,除非您正在使用$c

你不能,然而,定義foo兩種不同的行爲與一定數量的參數具有相同名稱的兩個不同的潛艇。你需要自己建立一個子。儘管如此,它並不總是有意義的。

sub foo { 
    my ($x, $y, $z) = @_; 
    if ($z) { 
    return $x + $y + $z; 
    else { 
    return $x - $y; 
    } 
} 
+0

感謝您的糾正@amon。這是一個錯字。 – simbabque

3

在Perl中,每個子接受一個標量列表,並返回一個標量列表。在C-ISH而言,這可以寫成

SV** some_sub(SV** args); 

SV*是一個標量變量的類型。

有一些方法可以限制參數:例如使用Method::Signatures的語法糖或原型(請勿使用原型)。

名單分配my ($a, $b, $c, $d, $e) = @_;工作陣列@_的大小無關。如果RHS(右側)具有較少的LHS元素,則左側的標量爲undef。例如。

sub foo { 
    my ($x, $y, $z) = @_; 
    say "x is ", $x // "undef"; 
    say "y is ", $y // "undef"; 
    say "z is ", $z // "undef"; 
} 

say "foo(1)"; 
foo(1); 
say "foo(1, 2, 3)"; 
foo(1, 2, 3); 
say "foo(1 .. 10_000)"; 
foo(1 .. 10_000); # ten thousand arguments! 

輸出:

foo(1) 
x is 1 
y is undef 
z is undef 
foo(1, 2, 3) 
x is 1 
y is 2 
z is 3 
foo(1 .. 10_000) 
x is 1 
y is 2 
z is 3 
3
+0

我並不是真的想強制簽名,就像靜態類型語言一樣。我只是想確保我不會以這種方式破壞事物(因爲我是Perl新手,來自靜態類型語言背景) – Jim

相關問題