2010-07-27 13 views
1

空值,當我運行不帶參數如下script.pl腳本:perl的+確定如果param是從ARG

./script.pl 

我沒有得到消息No arg。爲什麼?如何確定$param是否爲空值或空值,與來自ksh的[ -z相同?

#!/usr/bin/perl 
my $param = $ARGV[0]; 
if ($param = "") { 
    print No arg; 
} else { 
    print arg: $param; 
} 
+1

'$#ARGV == -1'是最簡單的。 http://perldoc.perl.org/perlvar。html#%40ARGV – msw 2010-07-27 08:17:38

+0

但是如果ARGV [1];爲空或ARGV [2];如何比較參數與..? – lidia 2010-07-27 08:22:22

回答

7

因爲它不是Perl。你從哪裏學習語法?它有很多錯誤。

  1. $param = ""一個空字符串分配給$param,這不是你想要的。

  2. null在Perl中拼寫爲undef

  3. 要比較字符串,請使用eq operator

  4. 必須quote字符串:print "No arg"

得多:

#!/usr/bin/perl 
if (@ARGV) { 
    print 'have parameters'; 
} else { 
    print q{don't have parameters}; 
} 
+0

但如果我有ARG1而不是ARG2我得到沒有參數? – lidia 2010-07-27 08:39:37

+0

我幾乎提出了同樣的建議,但我猜測OP想要擴展來處理不同數量的參數,然後測試@ARGV的長度並不是很整齊。 – 2010-07-27 08:43:59

+0

只需嘗試一下,看看。當你在命令行傳遞任何參數時,'@ ARGV'被填充值並且程序進入第一個分支。 – daxim 2010-07-27 08:46:59

1

OK,人們似乎發現了我以前的答案錯領先,所以這裏的另一種嘗試,更直接的這段時間。

你要找的測試是defined

my $param = $ARGV[0]; 
if (defined $param) { 
    print "arg: $param\n"; 
} else { 
    print "No arg\n"; 
} 

如果沒有足夠的參數填寫$ARGV[0](或其他後面的元素),在該位置的值將是undef,所以defined測試將評估爲false。

2

下面是一個例子來說明它好一點。

if($#ARGV == -1){ 
    print "No arguments passed.\n"; 
} else if($#ARGV == 0){ 
    print "One argument passed.\n"; 
} else { 
    print $#ARGV +1 ."arguments passed.\n"; 
} 

我喜歡用「標量@ARGV」,因爲這代表了數組中元素的數量。相反,$#ARGV是數組中最後一個元素的索引。這就是爲什麼它是一個。 如果$ [(這是一個設置Perl數組起始索引的特殊變量)被設置爲1而不是0(默認值),那麼對於我們的目的而言,$#ARGV不會被忽略。我不會與$ [因爲它是一個全球性的。改變可能會破壞很多模塊。

my $argument_count = scalar @ARGV; 
if($argument_count == 0){ 
    print "No arguments passed.\n"; 
} else if($argument_count == 1){ 
    print "One argument passed.\n"; 
} else { 
    print "$argument_count arguments passed.\n"; 
} 
0

如果param是空的,你可以自動做出PARAM VAL:

$ARGV[0] || 'yourParam'; 
0

這裏很方便片段製作腳本錯誤終止,如果沒有傳遞參數:

if (not defined $ARGV[0]) { 
    print STDERR "Error: missing parameter. Usage: perl $0 <required-parameter>\n"; 
    exit 1; 
} 

(有更緊湊和更詳細/強大的方式來寫這個,但作爲一個Perl新手,我發現這提供了一個清晰和簡潔的良好平衡。)