2011-04-19 59 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