2012-12-11 52 views
0

我有一個接受參數的Perl腳本。當我有單值參數,下面的代碼就夠了:基於正則表達式的Perl參數切換

    switch ($ARGV[0]) { 

        case "--cmd1" { 
          $action = "cmd1"; 
        } 


        case "--cmd2" { 
          $action = "cmd2"; 
        } 

現在,我已經在那裏指揮,cmd3有一個參數,如--cmd3=SOMETHING的情況下。由於SOMETHING可以變化,簡單的開關/外殼不再工作。基本上,我需要在命令本身上做一個開關/外殼。我想我可以使用正則表達式,第一個匹配組是命令,第二個是可選的equals。以下不起作用,但它說明了我正在嘗試做什麼。

    $ARGV[0] =~ m/(.*?)(=.*){0,1}/; 
        my $cmd = $1; 
        my $equals = $2; 

        switch ($cmd) { 

        case "--cmd1" { 
          $action = "cmd1"; 
        } 

        case "--cmd2" { 
          $action = "cmd2"; 
        } 

        case "--cmd3" { 
          $action = "cmd3"; 
          print $equals; 
        } 

:::::::::::::::::::::::::::::::::::編輯::::::: ::::::::::::::::::::::::::::::::::::::::::::::::

我明白了,但我會給那些回答讚揚並接受的人。我不能使用,因爲這意味着重組所有的東西。這是解決方案。

    switch ($ARGV[0]) { 

        case "--cmd1" { 
          $action = "cmd1"; 
        } 

        case "--cmd2" { 
          $action = "cmd2"; 
        } 

        case m/--cmd3(=.*)?/ { 
          $ARGV[0] =~ m/--cmd3(=.*)?/; 
          $action = "cmd3"; 
          print $1; 
        } 
+8

爲什麼不使用'Getopt :: *'? –

+2

將可能的命令放在分派表中,使用散列鍵作爲文字命令名稱,並將代碼引用作爲散列值。然後,在你的模式匹配後,你可以說:''dispatch {$ 1} - >($ 2)'「 – DavidO

+3

Perl的開關是一個(不推薦使用的)源代碼過濾器。給定/何時,或者何時可能會更好,但我主要是贊成使用基於散列的調度來實現類似的功能。 – DavidO

回答

1

這樣的事情呢?

my $cmd = ""; 
my $equals = ""; 

if($ARGV[0] =~ m/^\-\-cmd1$/){$cmd="cmd1"} 
if($ARGV[0] =~ m/^\-\-cmd2$/){$cmd="cmd2"} 
if($ARGV[0] =~ m/^\-\-cmd3=(.*)$/){$cmd="cmd3";$equals=$1} 
+0

我的錯誤,但在cmd3上的等於是可選的。 --cmd3和--cmd3 = SOMETHING產生不同的結果並且都是有效的。你可以保持接受。 – user974896

+0

如果你這樣做並且不介意「hacky」,你可以很容易地添加這一行來捕獲另一種形式的'cmd3':if($ ARGV [0] =〜m/^ \ - \ - cmd3 $ /){$ cmd =「cmd3」}' –

+2

無需在您的正則表達式中轉義'-'字符。此外,前兩個實際上應該是'if($ ARGV [0] eq'--cmd1')',因爲您沒有使用正則表達式特徵。 –

5

爲什麼不使用Getopt::Long

+0

該系統已經通過手動解析出參數來完成。它不能改變。我只是添加這個額外的功能。 – user974896

+0

所以你可以使用'Getopt :: Long'。 – mpe