2014-02-11 54 views
1

我的代碼在一個Perl文件中的以下行:如何在Perl中使用grep與數組?

@arr1 = grep(/"$subslots_det[0]"/,@grepped_int); 

烏拉圭回合參考@grepped_int陣列的轉儲看起來是這樣的:

$VAR1 = [ 
'GigabitEthernet4/2/1 unassigned  YES NVRAM administratively down down ', 
'GigabitEthernet7/1  unassigned  YES NVRAM administratively down down ', 
'GigabitEthernet7/2  unassigned  YES NVRAM administratively down down ', 
     ] 

這裏讓我們假設, $ subslots_det [0] =「4/2」;

所以grep的聲明應符合:

GigabitEthernet4/2/1 unassigned  YES NVRAM administratively down down ', 

眼下它不這樣做,IAM懷疑這是因爲在4/2的斜槓。 有沒有辦法可以逃脫在下面的命令正斜槓:

@arr1 = grep(/"$subslots_det[0]"/,@grepped_int); 

回答

5

這是因爲雙引號的。

@arr1 = grep(/$subslots_det[0]/, @grepped_int); 

正則表達式itself serves as quoting,因此各地$subslots_det[0]報價只是作爲文字引號字符,所以你要匹配"4/2"而不是4/2

例:

>perl -e '@s=("a/1","b/2"); @res=grep(/$s[0]/,("aa/1","bb/2")); print @res."\n"' 
1 

>perl -e '@s=("a/1","b/2"); @res=grep(/"$s[0]"/,("aa/1","bb/2")); print @res."\n"' 
0 

此外,如果你擔心逃跑(你不應該,除非它被用來作爲文字的正則表達式本身內),您可以隨時change the regex delimiter「/」到「/」字符「#」 或any other character

@arr1 = grep(m#$subslots_det[0]#, @grepped_int); 
@arr1 = grep(m!$subslots_det[0]!, @grepped_int); 
+0

我嘗試沒有報價,仍然犯規的比賽,但是,如果我做@ ARR1 = grep的(/ 4 \/2 /,@ grepped_int); – user3094070

+0

@ user3094070 - 只有在字面字符時才需要轉義「/」。你可以通過改變正則表達式字符從「/」到「#」來輕鬆測試,所以你不需要關心轉義:'@ arr1 = grep(m#$ s [0]#,@ grepped_int)' – DVK

+0

抱歉我的錯誤:)我已經定義了不同的匹配標準,這是它匹配,現在它完美的作品,非常感謝,答案接受。 – user3094070