Perl:如何从文件中提供正则表达式列表

时间:2013-10-29 12:52:48

标签: regex perl

因此,我需要解析一个文件,如果某些内容与模式匹配,请将其替换为:

while(<$ifh>) {
  s/(.*pattern_1*)/$1\nsome more stuff/ ;
  s/(.*pattern_2*)/$1\neven more stuff/;
  s/(.*pattern_3.*)// ;
  # and so on ...
  print $ofh $_;
}

问题:在文件中使用此正则表达式规则列表的最简单方法是什么(类似于sed'-f'选项)?

编辑:也许我需要澄清一下。我们需要在单独的文件中使用正则表达式规则(不在解析的文件中 - 尽管这很好,谢谢!),因此它们不是硬编码的。所以,基本上外部文件应该包含'//'行。 当然这可以用foreach循环和eval完成,或者甚至可以通过外部调用sed来完成,但我想可以有更好的东西。

问候,Wojtek

2 个答案:

答案 0 :(得分:0)

您可以创建模式并将它们存储在Perl列表中,然后简单地遍历输入循环中的模式。

my @patterns = ( qr/pattern1/, qr/pattern2/, qr/pattern3/, etc..);
while(<$ifh>) {
   for my $pattern (@patterns) {
      s/($pattern)/$1\neven more stuff/;
   }
   print $ofh $_;
}

答案 1 :(得分:0)

根据您的编辑,这是一种将正则表达式存储在外部文件中的方法。请注意,我不建议将整个s/.../.../语句存储在外部文件中,但您可以使用eval函数来完成它。然而,我将如何解决这个问题:

my (@regexes,$i);
$i=0;
while (my $line=<$rifh>) {
  chomp($line);
  if (index($line, "::")>-1) {
    my @texts=split(/::/,$line);
    $regexes[$i]{"to find"} = qr!$texts[0]!;
    $regexes[$i]{"replace with"} = $texts[1];
    $i++;
  }
}

while (my $line=<$ifh>) {
  chomp($line);
  foreach my $regex (@regexes)
     $line ~= s!$regex->{"to find"}!$regex->{"replace with"}!;
  print $ofh $line . "\n";
}

(我使用!作为正则表达式分隔符是我自己的样式机制,通常可用于允许在正则表达式定义中直接使用裸/个字符。)