首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >对子例程参数,Perl的移位赋值与@_的赋值有区别吗?

对子例程参数,Perl的移位赋值与@_的赋值有区别吗?
EN

Stack Overflow用户
提问于 2009-01-06 02:58:39
回答 6查看 6.3K关注 0票数 15

让我们暂时忽略Damian Conway的最佳实践,即任何给定子例程的位置参数不超过三个。

下面的两个例子在性能或功能上有什么不同吗?

使用shift

代码语言:javascript
复制
sub do_something_fantastical {
    my $foo   = shift;
    my $bar   = shift;
    my $baz   = shift;
    my $qux   = shift;
    my $quux  = shift;
    my $corge = shift;
}

使用@_

代码语言:javascript
复制
sub do_something_fantastical {
    my ($foo, $bar, $baz, $qux, $quux, $corge) = @_;
}

假设这两个示例在性能和功能方面是相同的,那么人们如何看待一种格式优于另一种格式?显然,使用@_的示例代码行数更少,但是使用shift不是更容易理解吗?欢迎有充分理由的意见。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-01-06 06:54:26

这是一个功能上的区别。shift会修改@_,而来自@_的赋值不会。如果之后不需要使用@_,那么这种差异对您来说可能无关紧要。我总是尝试使用列表赋值,但有时也会使用shift

但是,如果我从shift开始,如下所示:

代码语言:javascript
复制
 my( $param ) = shift;

我经常创建这个bug:

代码语言:javascript
复制
 my( $param, $other_param ) = shift;

这是因为我不经常使用shift,所以我忘了跳到赋值的右侧,将其更改为@_。这就是不使用shift的最佳实践的要点。我可以像您在示例中所做的那样,为每个shift创建单独的行,但这太乏味了。

票数 28
EN

Stack Overflow用户

发布于 2009-01-06 03:50:30

我认为shift示例比使用@_慢,因为它有6个函数调用,而不是1个。它是否值得注意甚至是可测量是另一个问题。在10k次迭代的循环中抛出每一个,并对它们进行计时。

至于美学,我更喜欢@_方法。使用shift方法进行意外的剪切和粘贴,似乎很容易打乱变量的顺序。另外,我也看到很多人这样做:

代码语言:javascript
复制
sub do_something {
   my $foo = shift;
   $foo .= ".1";

   my $baz = shift;
   $baz .= ".bak";

   my $bar = shift;
   $bar .= ".a";
}

这是非常糟糕的,很容易导致错误,例如,如果你剪切baz块并将其粘贴到bar块下。我完全赞成在使用位置附近定义变量,但我认为在函数顶部定义传入的变量更重要。

票数 8
EN

Stack Overflow用户

发布于 2009-01-06 03:57:01

我通常使用第一个版本。这是因为我通常需要将错误检查与移位一起进行,这更容易编写。说,

代码语言:javascript
复制
sub do_something_fantastical {
    my $foo   = shift || die("must have foo");
    my $bar   = shift || 0;  # $bar is optional
    # ...
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/415297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档