2011-06-01 45 views
1

我希望我的perl腳本正確解析用空格隔開兩個命令行參數爲兩個變量:如何在Perl中解析引用以及不帶引號的參數?

$ cat 1.pl 
print "arg1 = >$ARGV[0]<\n"; 
print "arg2 = >$ARGV[1]<\n"; 
$ perl 1.pl a b 
arg1 = >a< 
arg2 = >b< 
$ perl 1.pl "a b" 
arg1 = >a b< 
arg2 = >< 
$ 

是否有與此處理,而不是試圖檢測的報價是否被使用或不使用的一種通用的方式?

+1

你想要http://p3rl.org/Getopt::Long#Options_with_multiple_values,因此:'program --foo arg1 --foo arg2'。 – daxim 2011-06-01 13:24:05

回答

10

數據由shell傳遞給Perl。

  • program a b將發送ab
  • program 'a b'將發送a b
  • program "a b"將發送a b
  • program a\ b將發送a b

Perl有,據我所知,沒有告訴差異的方法之間的任何三個之間。

你可能會在split空間上的每一個參數,這將得到你所描述的效果......但它意味着以不同的方式工作在其他所有應用程序。

+7

確切地說;如果用戶明確引用了參數,那麼它就是*不是*「兩個命令行參數」。將它視爲兩個會讓你的用戶恨你。 – geoffspear 2011-06-01 13:10:51

+0

所以,我需要檢查是否有一個參數被傳遞或兩個(代碼期望兩個)。如果一個論點被通過了,我會把它分成兩個,這是對的嗎? – Lazer 2011-06-01 13:12:08

+9

你可以做。我會向用戶發出錯誤報告,並顯示使用情況信息。 – Quentin 2011-06-01 13:14:22

1

昆汀的答案並不完全適用於Windows。

同時,如果你想解析開關,Getopt :: Long是最好的。但如果你有兩個非開關參數,你可以試試這個窮舉法:

my @args = map { split ' ' } @ARGV; 
die usage() unless @args == 2; 

或本:

die usage() 
    unless (
    my ($arg1, $arg2) 
     = @ARGV == 1 ? (split ' ', $ARGV[0], 3) 
     : @ARGV == 2 ? @ARGV 
     :    () 
    ) == 2 
    ; 

這裏,die usage()只是一個僞代碼。