2010-08-25 224 views
3

我已经看到了这个样子Perl语句:这条语句做什么:();

() unless $some_var; 

那是什么旨在实现?

+2

请显示包含此声明的实际脚本。 – kennytm 2010-08-25 07:14:10

+1

从脚本中加入一些更多的代码,以便正确理解使用context()的代码。 – 2010-08-25 07:14:59

回答

0

if当且仅当条件为真时执行语句。

unless是相反的,它执行语句,除非条件为真(即,如果条件为假)。

更多详情参见:http://perldoc.perl.org/perlsyn.html

()仅仅是空列表,所以这段代码被提供的情况下空单的默认值,其中$ some_var是假的(可能是因为$ some_var是不确定的)。

+5

谢谢,我明白'除非'部分 - 但为什么'()'?空列表实现了什么? – Tony 2010-08-25 06:56:57

0

如果$ some_var为false,它将返回空列表。

如果我写 @s =() unless $some_var;,如果$some_var为假,我清空@s

这是我能想到的唯一方法。

+1

谢谢 - 对不起,如果我不清楚,但这是全部在一行 - 没有任务。 – Tony 2010-08-25 07:12:49

1

它可能用于隐式返回,如果$some_var评估为true,则返回它,否则返回空列表。

+0

+1只有用的答案atm – 2010-08-25 07:08:55

+0

谢谢 - 不知道如何工作,因为它发生在脚本的开始,而不是在子例程中,并且相同的脚本以退出(0)结束; – Tony 2010-08-25 07:10:43

+0

请记住,当一个子程序退出时,返回值是最后处理的值(或者,如果有'return'语句,不管那个'return'语句被调用了什么)。 – 2010-08-25 07:12:01

1

本身,这个表达式是一个nop。但是如果没有显式的返回语句并且这个值碰巧是块中的最后一个东西,那么值(空列表)可以从子例程或do()块自动返回。

+0

谢谢,我喜欢这个理论......但它接近主程序的顶部,很多东西发生在它之后:-( – Tony 2010-08-25 07:27:47

9

这里有一些事情正在进行,但最重要的是这种线通常会显示为执行块的最后一行[1]。在这种情况下,块的值是最后执行的语句的值[2]。现在,包含unless的语句具有左侧的值,如果右侧为true,并且右侧的值为其他值,则这是一种说法“块的值为$some_var if $some_var碰巧是真的,否则为()“。

()仅仅是空列表,所以这段代码被提供的情况下空单,其中$some_var是假的默认值(可能是因为$some_var是不确定的。)

更常用来达到同样的效果与or,在同等

$some_var or(); 

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

use strict; 
use warnings; 

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

print "\@x: <@x>\n\@y: <@y>\n"; 

@x是空阵列,因为0为false,而@y是包含5的数组,因为5为true。

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

[1]:这是由evaldo评估或提供给块(例如)mapgrep,或作为子程序调用块。

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

+0

谢谢你的详细分析;似乎并不是这里发生的事情(如果任何东西)。这是一个更多的脚本,大量的后续代码被省略,并最终以'exit(0);'结尾:': # - MAIN -------------- -------------------------------------------------- ------- GetOptions( “-interactive”, “-request_file = S”,) 或使用(); 使用,除非($ opt_request_file); (),除非(opt_interactive $); $ today = strftime“。%Y-%m-%d”,localtime; $ dte = strftime“%Y-%m-%d”,localtime; col =(“M”,“N”,“O”,“P”,“Q”,“R”,“S”); 。 。 。 – Tony 2010-08-25 07:31:36

+0

对不起,如果我格式化不好,只需从腻子中剪切和粘贴,在这个文本框中看起来没问题:-( – Tony 2010-08-25 07:35:52

+4

在这种情况下,它对我来说看起来像没有任何作用,猜测交互选项实际上未实现,并且except语句是作为一个代码从未写过的地方持有者,我会毫不犹豫地将其删除 – darch 2010-08-25 07:38:31

3

解开了谜底:

GetOptions(
    "-interactive", 
    "-request_file=s", 
) or usage(); 

usage unless ($opt_request_file); 
() unless ($opt_interactive); 

看来 '();'是误导性的 - 它什么都不做,目的只是提一下$ opt_interactive变量......作为一种压制perl警告'Name'$ var“只使用一次”的方法。

感谢所有试图揭露光芒的人!