【问题标题】:Perl, Best Practices: Empty Arguments handling inside subroutine, use of $_Perl,最佳实践:在子例程中处理空参数,使用 $_
【发布时间】:2019-11-15 10:02:24
【问题描述】:

我在阅读《Damian Conway 的 Perl 最佳实践》一书时遇到了以下代码示例:

    sub fix {
        my (@args) = @_ ? @_ : $_; # Default to fixing $_ if no args provided

        for my $arg (@args) {
            print $arg;
        }

        return;
    }

能否请您帮我理解一下作者在这部分代码中到底想完成什么?

my (@args) = @_ ? @_ : $_; # Default to fixing $_ if no args provided

我了解“if”的作用,并且很清楚,当用户不为“fix() sub”提供参数时,我们会将$_ 分配给“@args”

但不清楚将$_ 分配给@args 有什么好处,因为$_ 是未定义的,对吧?

提前谢谢你。

【问题讨论】:

  • 对 Perl 最佳实践持保留态度很重要,它已经过时了,而且它的许多想法从长远来看都是有害的。
  • 能否建议您在哪里搜索最新鲜的 Perl 的“最佳实践”指南?
  • 我不知道任何这样的书,但我和 IRC 社区的其他人遵循/推荐的一些做法编码在 Perl::Critic::Freenode 中。
  • Modern Perl 是另一个不错的选择。

标签: perl arguments subroutine


【解决方案1】:

@_$_ 是两个不同的变量,所以即使@_ 为空,也可以定义$_$_ 在许多函数中用作默认值,例如lengthchr

参见$_@_

【讨论】:

  • 第二个链接“char”给出“未找到”页面
  • 请注意,大多数使用 $_ 作为默认参数的内置函数只接受一个参数。 Damian 建议使用 LIST 或默认为 $_ 的 sub 是一个糟糕的想法,因为你不能传递一个数组而不担心它可能是空的并导致 $_ 被使用。
  • @ysth 比这更复杂:大多数使用 $_ 作为默认参数的函数都是通过解析器特殊情况或 _ 原型来实现的,后者将其第一个参数强制转换为标量上下文。 即使它是一个数组。 所以通常$_ 甚至不会被使用,除非没有向解析器提供任何参数,这当然除了通过这样的原型之外是不可能确定的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-18
  • 1970-01-01
  • 1970-01-01
  • 2012-03-05
相关资源
最近更新 更多