2014-09-03 77 views
1

可能是一個簡單的Perl問題:在Perl中,如何檢查未定義的OR空白參數?

我有一些類似於下面的代碼:

if (not defined $id) { 
    print "Enter ID number: "; 
    chomp ($id = <STDIN>); 
    exit 0 if ($id eq ""); # If empty string, exit. 
} 
if (not defined $name) { 
    print "Enter name: "; 
    chomp ($name = <STDIN>); 
    exit 0 if ($name eq ""); # If empty string, exit. 
} 
if (not defined $class) { 
    print "Enter class: "; 
    chomp ($class = <STDIN>); 
    exit 0 if ($class eq ""); # If empty string, exit. 
} 

我希望能夠通過可能只有其中的一些(例如姓名和班級,但不是ID ),通過毛坯的unpassed的,所以我想下面將工作:

if (not defined $id || $id eq "") { 
    print "Enter ID number: "; 
    chomp ($id = <STDIN>); 
    exit 0 if ($id eq ""); # If empty string, exit. 
} 

,但它似乎沒有如果我通過例如工作如下:

perl "myperlroutine.pl" "" "Mickey Mouse" "Entry" 

命令窗口(我在Windows上運行這個)短暫出現,然後立即消失。

我錯過了一些明顯的東西嗎?

+0

空白仍然定義。它只是空白。 – 2014-09-03 18:24:26

+1

[ysth's answer](http://stackoverflow.com/a/25651344/176646)在你的邏輯中解決了這個問題,但是請看[如何簡明地檢查一個$變量是否被定義並且包含一個非零長度的字符串?] (http://stackoverflow.com/questions/1480066/in-perl-how-can-i-concisely-check-if-a-variable-is-defined-and-contains-a-non)替代解決方案。 – ThisSuitIsBlackNot 2014-09-03 18:50:10

+0

感謝所有有用的答案。獎品歸屬於@ysth。戴夫克羅斯 - 如果我只是能夠改變這一點,但它已經被從多個地方調用,我有時間只做一個快速修復:( – roryhewitt 2014-09-04 19:25:03

回答

4

您正在使用低優先級not,您應該使用高優先級!

所以你說:

if (not(defined $id || $id eq "")) 

這就好比:

if (! defined $id && $id ne '') 

這始終是假的。

2
if (not length($id)) { 
    ... 
} 

很多涵蓋了你正在尋找的任何東西。

又名:

unless (length $id) { 
    ... 
} 
+3

注意:這在Perl 5.12之前發出警告 – ikegami 2014-09-03 19:06:51

+1

解釋了錯誤會更好。 – ikegami 2014-09-03 19:07:38

0

如果窗口瞬間消失,通常表示一個編譯錯誤。您應該打開命令窗口並從命令行運行腳本:

單擊「開始」 鍵入「cmd」到搜索欄並按回車。

然後在命令行中運行腳本如下: 「perl的full_path_to_script \ script_name.pl」

如果你這樣做,命令窗口應該不會立即結束,而是應該給一些爲什麼您的反饋腳本無法運行。如果你仍然無法弄清楚爲什麼這樣做後失敗,你也應該發佈編譯錯誤,我們可以看看它們。

另外,ysth是正確的,你應該使用「!」而不是「不」。

例如:

if ((!defined $id) || ($id eq '')) { 
    print "Enter ID number: "; 
    chomp ($id = <STDIN>); 
    exit 0 if ($id eq ""); # If empty string, exit. 
} 
1

您已經收到很好的答案解釋到底什麼是你的代碼錯誤。但是沒有人對更大的圖景發表評論。

使用像這樣的位置參數是(如你所見)當參數變爲可選時會產生問題。在這種情況下,使用命名參數是個好主意。標準的Perl庫帶有兩個模塊(Getopt::StdGetopt::Long),可以很容易地創建靈活的命令行選項集。我建議你看看使用其中之一。

+1

總是以Getopt :: Long開頭;沒有理由使用:: Std來代替新代碼 – ysth 2014-09-04 16:06:23