因此,我需要解析一个文件,如果某些内容与模式匹配,请将其替换为:
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
答案 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";
}
(我使用!
作为正则表达式分隔符是我自己的样式机制,通常可用于允许在正则表达式定义中直接使用裸/
个字符。)