2010-08-25 90 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「只使用一次」的方法。

感謝所有試圖揭露光芒的人!