2013-12-17 16 views
3

這裏是例子:

$a = shift; 
$b = shift; 
push(@ARGV,$b); 
$c = <>; 

print "\$b: $b\n"; 
print "\$c: $c\n"; 
print "\$ARGV: $ARGV\n"; 
print "\@ARGV: @ARGV\n"; 

和輸出:

$b: file1 
$c: dir3 

$ARGV: file2 
@ARGV: file3 file1 

我不明白,在打印$ ARGV當沒有任何指標究竟發生了什麼。它打印第一個參數,然後從數組中刪除它?因爲我所有的陳述後認爲排列成爲

file2 file3 file1 

調用:

perl port.pl -axt file1 file2 file3 

文件1包含線路:

dir1 
dir2 

文件2:

dir3 
dir4 
dir5 

文件3:

​​

回答

7

格雷格曾引用相應的文檔,所以這裏發生了什麼

$a = shift;     # "-axt" is removed from @ARGV and assigned to $a 
$b = shift;     # "file1" likewise 
push(@ARGV,$b);    # "file1" inserted at end of @ARGV 
$c = <>;     # "file2" is removed from @ARGV, and its file 
          # handle opened, the first line of file2 is read 

當「文件2」的文件句柄打開的簡要介紹,它設置在$ARGV的文件名。正如Greg所說,@ARGV$ARGV是完全不同的變量。

鑽石操作<>的內部工作可能就是在這裏混淆你的,因爲它的近似$ARGV = shift @ARGV

+1

我認爲這個人應該得到正確的答案 – JackXu

+0

哦,我明白了,是的,我還在想如何從陣列中刪除參數。謝謝! – MeesterMarcus

+0

不客氣。 – TLP

5

在Perl中,$ARGV@ARGV是完全不同的。從perlvar

$ ARGV從<>讀取時

包含當前文件的名稱。

@ARGV

陣列@ARGV包含專門用於該腳本的命令行參數。 $#ARGV通常是參數個數減1,因爲$ARGV[0]是第一個參數,而不是程序的命令名稱本身。有關命令名稱,請參見$0

+0

沒關係啊是有道理的,謝謝! – MeesterMarcus

4

不,但是<>呢。 <>是短期的<ARGV>(這又是短期的readline(ARGV)) ,其中ARGV是一個特殊的文件句柄從@ARGV列出的文件讀取(或STDIN如果@ARGV爲空)。當它打開@ARGV中的文件時,它會從@ARGV中刪除它們並將它們存儲在$ARGV中。

相關問題