0

所以,我需要解析一个文件,如果有匹配的模式,用一些东西替换它:

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' 选项)?

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

问候, Wojtek

4

2 回答 2

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";
}

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

于 2013-10-29T13:02:40.327 回答
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 $_;
}
于 2013-10-29T13:01:34.107 回答