2013-06-19 28 views
1

我正在開發一個Perl中的小實用程序腳本,主要是爲了學習該語言。該腳本有一個主要功能,作爲動作調度員,許多小型動作例程每個執行一項特定任務(如打印今天的日子,計算年齡超過7天的文件等)。用戶將使用諸如「./myscript doy」,「./myscript doy 01/01/2013」​​,「./myscript ls/home/test gt 7天」等語法來調用腳本。一般來說,它是「./ myscript行動[混合參數&關鍵詞]「。關鍵字可以是「小於」,「大於」等。即使關鍵字發生變化(而不是根據父操作中的關鍵字執行if..else),目標操作也可能不同。目標是通過在調度表中添加一個條目並編寫一個小動作來保持腳本的可擴展性(對於我自己和其他人)。perl獲得反向引用計數

的調度表是散列如下

​​

密鑰哈希的是命令語法本身(顯示給用戶作爲幫助一部分,與說明書一起)。 RegEx用於與命令行參數(加入)進行比較以決定請求的操作。

現在,爲了減輕操作例程的負擔,我想在主函數中創建一個參數數組,並將其作爲參數傳遞給操作例程。所以像「./myscript ls/home/test gt 7天」這樣的命令行會導致@args = ['/ home/test',7]。問題是我找不到一種方法來確定插入到@args中的有效後備引用($ 1,$ 2,...)的數量。當然,我知道每個動作的預期參數計數,但其目的是保持通用。我發現的一個選項是檢查範圍(1..10),如「if(defined $ {$ i})」。這在循環中使用時不適用於「使用嚴格」選項。請建議是否有更好的方法來捕獲匹配的參數並將其傳遞給行動。

回答

3

反向引用是一種正則表達式指令,用於匹配先前捕獲的內容(例如\1)。您實際上需要捕獲次數((...))。

由於正則表達式匹配返回它捕獲列表範圍內,你只需要算那些

my @captures = $str =~ /.../; 
my $count = @captures; 

my $count = my @captures = $str =~ /.../; 

my $count =() = $str =~ /.../; 

你也檢查@-

my $count = /.../ ? $#- : undef; 
+0

謝謝。 「my @ captures = $ str =〜/.../;」做這項工作。這是所需的數組:) – mpathi

+2

你可能應該提到'm /'w/o'g'標誌在正則表達式中有括號時返回列表上下文中捕獲的子串的列表;當正則表達式中沒有括號時,在列表上下文中返回'(1)'。 – doubleDown