perl - 为什么 Perl::Critic 不喜欢使用 shift 来填充子例程变量?

标签 perl perl-critic

最近,我决定开始使用 Perl::Critic更频繁地在我的代码上。在使用 Perl 编程近 7 年之后,我已经习惯了大多数 Perl 最佳实践很长一段时间,但我知道总有改进的空间。但一直困扰我的一件事是 Perl::Critic不喜欢我为子例程解压 @_ 的方式。举个例子:

sub my_way_to_unpack {
    my $variable1 = shift @_;
    my $variable2 = shift @_;

    my $result = $variable1 + $variable2;
    return $result;
}

这就是我一直以来的做法,正如 PerlMonks 和 Stack Overflow 上讨论的那样,它的 not necessarily evil要么。

将上面的代码片段更改为...

sub perl_critics_way_to_unpack {
    my ($variable1, $variable2) = @_;

    my $result = $variable1 + $variable2;
    return $result;
}

...也可以,但我发现它更难阅读。我还读过达米安康威的书Perl Best Practices我真的不明白我首选的解包方法如何符合他的建议,避免直接使用 @_ ,如 Perl::Critic暗示。我一直觉得康威在谈论一些肮脏的事情,例如:

sub not_unpacking {
    my $result = $_[0] + $_[1];
    return $result;
}

上面的示例很糟糕且难以阅读,我永远不会考虑将其写入一段生产代码中。

简而言之,为什么Perl::Critic认为我的首选方式不好?我用shift拆包真的犯了滔天大罪吗?

除了我之外,其他人是否认为这应该与 Perl::Critic 一起提出来?维护者?

最佳答案

简单的答案是 Perl::Critic 在这里并没有遵循 PBP。这 书中明确指出,转变习惯用法不仅可以接受,而且 在某些情况下实际上是首选。

关于perl - 为什么 Perl::Critic 不喜欢使用 shift 来填充子例程变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2275317/

相关文章:

批评 : eval "require $module";

Perl::Brutal 模式下的 Critic

javascript - 如何安排在perl中每小时执行一次脚本的一部分,而其余脚本每分钟刷新一次

mysql - Perl MySQL 查询访问超出数组的范围

正则表达式匹配以特殊字符开头的单词边界

Perl IO::Socket 连续读/写

perl IPC :Open3 minimal to pass perlcritic?

perl - 禁用整个文件的评论家 - Parse::RecDescent 预编译解析器和 PerlCritic/Tidyall

Perl : constant & require