2011-04-19 61 views
12

在C++中,我會做這樣的事情:你如何在Perl中訪問函數參數?

void some_func(const char *str, ...); 
some_func("hi %s u r %d", "n00b", 420); 

在PHP中,我會做這樣的:

function some_func() 
{ 
    $args = func_get_args(); 
} 
some_func($holy, $moly, $guacomole); 

如何做到這一點在Perl?

sub wut { 
    # What goes here? 
} 

回答

24

你會怎麼做:當你調用一個函數

sub wut { 
    my @args = @_; 
    ... 
} 

Perl的自動填充特殊@_變量。可以以多種方式訪問​​它:

  • 直接,通過簡單地使用@_或單獨的元件在其內作爲$_[0]$_[1],等等
  • 通過將其分配給另一個數組,如上所示
  • 通過將其分配給標量的列表(或可能的散列,或另一個陣列,或它們的組合):

    sub wut { 
        my ($arg1, $arg2, $arg3, @others) = @_; 
        ... 
    }

請注意,在這種形式下,您需要將數組@others放在最後,因爲如果您將它放在較早的位置,它將吸取所有@_的元素。換句話說,這是不行的:

sub wut { 
    my ($arg1, @others, $arg2) = @_; 
    ... 
} 

您還可以使用shift拉出值的@_

sub wut { 
    my $arg1 = shift; 
    my $arg2 = shift; 
    my @others = @_; 
    ... 
} 

注意shift將在@_自動工作,如果你不提供它有一個論點。

編輯:您還可以通過使用散列或散列引用來使用命名參數。例如,如果你叫wut()喜歡:

wut($arg1, { option1 => 'hello', option2 => 'goodbye' }); 

...然後你可以這樣做:

sub wut { 
    my $arg1 = shift; 
    my $opts = shift; 
    my $option1 = $opts->{option1} || "default"; 
    my $option2 = $opts->{option2} || "default2"; 
    ... 
} 

這將是引進的命名參數到您的功能的好方法,讓你可以稍後添加參數,您不必擔心它們傳遞的順序。

+3

如果你有*很多很多參數,你可能想避免複製它們:'sub wut {for my $ arg(@_){blah blah blah}}''。不過要小心,因爲'@ _'中的每個元素都是原始參數的別名,您可以**更改調用變量**。 – daotoad 2011-04-19 16:01:36

+0

您可以在11分鐘內接受答案 – JOSHUA 2011-04-19 16:02:22

+1

您可能還想通過'my%args = @_;' – friedo 2011-04-19 18:52:13