2013-07-09 120 views
2

我一直在通過Perl資源進行搜索,而且我看不到錯在哪裏。我敢肯定,我失去了一些東西明顯,因爲當我給你

my $gArgc = $#ARGV;

但叫我的程序perl pkTkPtBdTkNo.pl test.txt

$#ARGV等於0,我想不通爲什麼。

#! /usr/bin/perl -w 

use strict; 

my $gArgc = $#ARGV; 
my $input_line; 
my $bad_input; 

print($gArgc); 
die ("Usage pkTkPtBdTkNo.pl input-line") 
    if(0 == $gArgc); 

$input_line = $ARGV[0]; 
$bad_input = ($input_line =~ /\"\d+\D+\d*\",/); 
print($bad_input); 
+0

'$#ARGV'是數組元素的計數,所以這裏是@ARGV的計數。當數組從perl中的0開始時,它是0。如果你沒有將任何參數傳遞給你的腳本,它會返回-1 – KeepCalmAndCarryOn

+6

僅僅是迂腐,它不是@ARGV中元素的數量,而是最後一個元素的索引,這就是爲什麼它是0.你應該把你的答案放在所以它可以被提高(考慮到這一點後)。 –

回答

7

man perlintro

特殊變量$#數組告訴你一個數組的最後一個元素的索引: ... 你也許會使用$#數組+ 1來告訴你數組中有多少項。 不要打擾。碰巧,使用@array其中的Perl希望找到一個標值(「在 標量上下文」)會給你的數組中元素的個數:

所以,如果你傳遞0參數,$# ARGV將爲-1,因爲數組中沒有元素。如果您傳遞參數1(在你的例子),$#ARGV將爲0

1

這應該是總是正確,如$#ARGV+1 == @ARGV$#ARGV陣列@ARGV最後索引。

1

變量$#ARGV在@ARGV數組的最後一個元素的下標,因爲數組是零基於,在命令行上給出的參數的個數$#ARGV + 1

0

你可以嘗試:

@ARGV 還是死亡 「的用法pkTkPtBdTkNo.pl輸入線」

我發現避免$#array_name語法完全改進可讀性很大, 因爲這裏perl會自動將@ARGV變成一個標量(值爲0)。