簡體   English   中英

在 Perl 中,如何檢查未定義的 OR 空白參數?

[英]In Perl, how do I check for an undefined OR blank parameter?

我有一些像下面這樣的代碼:

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),為未傳遞的傳遞空白,所以我認為以下方法可行:

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 上運行它)短暫出現然后立即消失。

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

您使用的是低優先級, not您應該使用高優先級的地方! .

所以你是說:

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

這就像:

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

這總是錯誤的。

也一樣

if ( ! defined $id || $id eq '' )

反而。

在 Perl 5.12 及更高版本中,length() 在傳遞 undef 時不再發出警告,這非常方便。 所以你可以簡單地做:

if ( ! length $id ) {

這是短代碼,但如果$id可能是一個很長的 UTF-8 字符串,那么它可能效率低下,在這種情況下很難確定長度。 在那里我更傾向於這樣做:

if ( ( $id // '' ) eq '' ) {

但是除非您熟悉該習語,否則這不是超級可讀的。

您已經收到了很好的答案,可以准確地解釋您的代碼有什么問題。 但沒有人對更大的圖景發表評論。

當參數變為可選時,使用這樣的位置參數(如您所見)是有問題的。 在這種情況下,使用命名參數是一個更好的主意。 標准 Perl 庫帶有兩個模塊( Getopt::StdGetopt::Long ),可以輕松創建靈活的命令行選項集。 我建議您考慮使用其中之一。

這幾乎涵蓋了您正在尋找的任何內容:

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

又名:

 unless ( length $id ) { 
     ...
 }

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

  • 點擊“開始”
  • 在搜索欄中鍵入“cmd”,然后按 Enter

然后從命令行運行腳本,如下所示:

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.
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM