如何在perl中使用grep与数组?

时间:2014-02-11 05:13:42

标签: regex perl grep

我在perl文件中有以下几行代码:

@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    ',

现在它不会那样做,我怀疑这是因为4/2的正斜线。 有没有办法可以在以下命令中转义正斜杠:

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

1 个答案:

答案 0 :(得分: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

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