perl - Perl 的移位与@_ 的子程序参数赋值有区别吗?

标签 perl parameters subroutine

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

下面的两个示例在性能或功能方面有什么区别吗?

使用 shift :

sub do_something_fantastical {
    my $foo   = shift;
    my $bar   = shift;
    my $baz   = shift;
    my $qux   = shift;
    my $quux  = shift;
    my $corge = shift;
}

使用 @_ :
sub do_something_fantastical {
    my ($foo, $bar, $baz, $qux, $quux, $corge) = @_;
}

假设两个示例在性能和功能方面都相同,那么人们对一种格式有何看法?显然使用 @_ 的例子是更少的代码行,但使用 shift 不是更清晰吗?如另一个示例所示?欢迎有充分理由的意见。

最佳答案

有功能上的区别。 shift修改 @_ ,以及来自 @_ 的分配才不是。如果您不需要使用 @_之后,这种差异对您来说可能无关紧要。我尝试总是使用列表分配,但有时我会使用 shift .

但是,如果我从 shift 开始,像这样:

 my( $param ) = shift;

我经常创建这个错误:
 my( $param, $other_param ) = shift;

那是因为我不使用 shift经常这样,所以我忘记了到作业的右侧将其更改为 @_ .这就是不使用 shift 的最佳实践的要点。 .我可以为每个 shift 制作单独的行正如您在示例中所做的那样,但这很乏味。

关于perl - Perl 的移位与@_ 的子程序参数赋值有区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/415297/

相关文章:

mysql - 复制特殊字符,例如从一个数据库到另一个数据库的乌尔都语字母

java - Log4J2:替换参数无法正常工作

程序集 'call' 与 'jmp'

perl - 如何使用 Perl 脚本将 Gmail 中的邮件标记为 'read' 并使用 Mail::Webmail::Gmail 删除它们?

Perl、字符串、 float 、单元测试和正则表达式!

javascript - 使用 jQueryeach() 带参数获取函数?

mysql - 将存储过程结果传递给参数

function - ARM 汇编语言中的两个函数/子例程

function - 动态创建函数/子程序的 AutoHotkey 热键

regex -\Q 和\E 内的哈希值