[英]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::Std和Getopt::Long ),可以輕松創建靈活的命令行選項集。 我建議您考慮使用其中之一。
這幾乎涵蓋了您正在尋找的任何內容:
if ( not length( $id )) {
...
}
又名:
unless ( length $id ) {
...
}
如果您的窗口立即消失,通常表示編譯錯誤。 您應該打開命令窗口並從命令行運行腳本:
然后從命令行運行腳本,如下所示:
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.