Perl最佳实践:子例程内空参数处理,使用$_

3

我在阅读《Perl Best Practices》(作者:Damian Conway)时遇到了以下代码示例:

    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 有什么好处呢?

提前感谢。


1
重要的是要对Perl最佳实践持保留态度,因为它已经相当过时了,其中许多想法在长期运行中被证明是有害的。 - Grinnz
请问您能否建议一下哪里是搜索最新的Perl“最佳实践”指南的最佳地点? - Nazar
我不知道有什么书可以参考,但是我和其他IRC社区的人遵循/推荐的一些实践已经编码在Perl::Critic::Freenode中了。 - Grinnz
现代Perl是另一个不错的选择。 - Grinnz
1个回答

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

第二个链接“char”显示“未找到”页面。 - Nazar
6
请注意,大多数使用$_作为默认参数的内建函数只接受一个参数。Damian提出的接受列表或默认值为$_的子程序是个糟糕的想法,因为你无法传递一个数组而不担心它可能为空并导致使用$_ - ysth
1
@ysth,甚至比这更复杂:大多数使用 $_ 作为默认参数的函数都是通过解析器特殊情况或 _ 原型来实现的,后者将其第一个参数强制转换为标量上下文。即使它是一个数组。因此,通常情况下,除非没有提供参数给解析器,否则根本不会使用 $_,而这当然只能通过这样的原型来确定。 - Grinnz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接