子程序中`shift`和`@ _`之间有区别吗?

use*_*613 7 perl

我总是使用@_[0]获取第一个参数并用于@_[1]获取第二个参数.但是当我在线搜索代码片段时,我发现很多人都喜欢使用该shift关键字.我发现shift关键字根本不直观.这两者之间是否有任何功能差异?

TJ *_*J B 14

是的,两者之间存在差异. shift会改变@_ (你可能会认为这将是一个让变速变慢的操作), $_[0]或者$_[1]只是分配而且根本不会改变@_.

写作的审美方式是:

sub this_is_better {
    my ( $foo, $bar, $hey, $whoa, $doll, $bugs ) = @_;
}
Run Code Online (Sandbox Code Playgroud)

  • 转移并不比简单的转移慢得多.这真的取决于你想做什么.例如,一个常见的习语是我的$ self = shift; 我的%args = @_; 从@_中删除第一个元素,并将剩余的元素转储到哈希中. (2认同)
  • @ user1032613:您明确询问是否存在"功能差异"; 你没有问过"性能差异".如果你的意思是后者而不是前者,请更新你的问题.(FWIW,我更喜欢"美学"方式.+ 1) (2认同)
  • 至于性能,Perl解释器识别许多模式并非常有效地处理它们.如果这些速度相同或"显然较慢"的成语实际上快了10倍,我也不会感到惊讶.如果你在意,写一个测试并测量. (2认同)
  • 表现很棘手.Perl 5.10.0实际上有一个错误使得`shift`明显快于`my(...)= @ _`(列表分配优化意外地被禁用).它在5.10.1中得到修复. (2认同)
  • 在代码和机器之间有这么多层,你无法猜测哪个操作会更快.记得[在制作演出声明之前进行基准测试](https://gist.github.com/3795945),`my($ foo)= @ _`是获取参数的最慢方法之一.`shift`和`$ _ [0]`几乎完全相同(`shift`是5.16中最快的一小部分),但它实际上是``$ foo` vs`my($ foo)`这才有所不同.惊喜!**但是**这一切都不重要,你在子程序中所做的事情会淹没任何性能差异. (2认同)