这句话是做什么的:();

Ton*_*ony 3 perl

我见过perl语句看起来像这样:

() unless $some_var;
Run Code Online (Sandbox Code Playgroud)

那打算实现什么目标?

dar*_*rch 9

这里有几件事情,但最重要的是这种线通常会显示为执行块的最后一行[1].在该上下文中,块的值是最后执行的语句的值[2].现在,unless如果右侧为真,则包含左侧的语句,否则为右侧的值,因此这是一种说"块的值$some_var是否$some_var恰好是是的,()否则".

()仅仅是空列表,因此此代码$some_var为假列表的情况提供了空列表的默认值(可能是因为$some_var未定义.)

or等效物一样,更常见的是达到相同的效果

$some_var or ();
Run Code Online (Sandbox Code Playgroud)

放在一起,我们可以看到这些情况:

use strict;
use warnings;

my @x = do { () unless 0 };
my @y = do { () unless 5 };

print "\@x: <@x>\n\@y: <@y>\n";
Run Code Online (Sandbox Code Playgroud)

@x是空数组因为0是假,而是@y包含5因为5是真的数组.

除了作为块的最后一个语句之外的任何地方() unless $some_var;都是无操作.但是,once如果$some_var没有另外提及,它确实会抑制警告.

[1]:这是通过评估一个块evaldo或提供给(例如)mapgrep,或作为子程序调用块.

[2]:"最后执行的语句的值"是一个奇怪的短语; 大多数只有表达式才有值.但是因为Perl包含的概念是,在没有显式返回的情况下,块的值是最后一个语句的值,Perl需要这个奇怪的短语.

  • 在这种背景下,它对我来说似乎是一种无操作.在猜测中,交互式选项实际上是未实现的,而除非语句在那里作为一些从未写过的代码的占位符.我会毫不犹豫地删除它. (4认同)
  • 鉴于该代码示例中显示的Getopt :: Long使用不正确,可能会出现另一种解释:该行充当抑制"一次性使用"警告的方式.鉴于这个编译,我建议除了摆脱苛刻的选择之外,还要添加"use strict". (3认同)