Perl 的外部傳參
PERL若在命令列中有代入參數的話,可以直接用陣列@ARGV來取用,這裡的ARGV都得大寫
例如 t.pl
#!/usr/bin/perl -w
print "@ARGV";
print "\n". $ARGV[1]; #第2個傳參
執行
# ./t.pl 0 1 2 3 4
0 1 2 3 4
1
個別參數分別是$ARGV[0]、$ARGV[1]、$ARGV[2].....
判斷傳參是否存在的方法
如果該參數不存在,會出現這樣的錯誤:
Use of uninitialized value ...
所以取用前得先判斷該參數是否存在
if( !$ARGV[0] ) {die "請輸入第一個參數\r\n";}
#請注意'!' 因為,ARGV[0]並非undef,而是無初始值。
所以寫成下面這樣都是錯的:
if( undef ($ARGV[0] ) ){...} X
if( $ARGV[0] eq "" ){...} X
if( $ARGV[0] == "" ){...} X
if( $ARGV[0] == undef ){...} X
只有這樣是正確的
if( !$ARGV[0] ) { ... } O
和PHP有點不一樣的在於要取得執行程式本身(含你指定的路徑),只要使用特殊變數 $0 即可:一個錢號和數字0,以上例而言:
print $0; #./t.pl
參數帶有中文字的處理方式
當參數帶有中文字,到了系統中會變成亂碼:
# ./t.pl -n "這裡是精讚部落"
-n éæ¯ä¸ä¸²ä¸æå <==中文字會變亂碼
-n éæ¯ä¸ä¸²ä¸æå <==中文字會變亂碼
t.pl為上面的範例程式,其中傳入兩個參數 "-n" 及"這裡是精讚部落"。中文字顯示部分會變亂碼
原本這是很棘手的問題,但只要用 decode來處理即可:
use Encode;
print "@ARGV";
print decode("utf8",$ARGV[1]);
print "@ARGV";
print decode("utf8",$ARGV[1]);
結果
-n 這裡是精讚部落
編修原文 2009-10-21 13:39:42