我正在读取输入文件(IN)的每一行并将行读取打印到输出文件(OUT),如果该行以其中一种模式开头,例如“ab”,“cd”,“ef”, “gh”,“ij”等。打印的行是“pattern:100”形式或“pattern:100:200”形式。我需要将“pattern”替换为“myPattern”,即将当前行打印到FILE,但在第一次出现“:”之前用“myPattern”替换所有文本。做这个的最好方式是什么?
目前我有:
while ( <IN> )
{
print FILE if /^ab:|^bc:|^ef:|^gh:/;
}
我不确定substr替换是否有帮助,因为“pattern”可以是“ab”或“cd”或“ef”或“gh”等。
谢谢! 双
答案 0 :(得分:3)
通常,这样做:
my %subst = ( 'ab' => 'newab', 'bc' => 'newbc', 'xy' => 'newxy' );
my $regex = join( '|', map quotemeta, sort { length($b) <=> length($a) } keys %subst );
$regex = qr/^($regex):/;
while ( <IN> ) {
print FILE if s/$regex/$subst{$1}:/;
}
排序将最长的排序放在第一位,这样如果数据有ab ::且ab和ab都被替换,则使用ab:而不是ab。
答案 1 :(得分:1)
Perl的替换运算符(a)使用第一个匹配,(b)仅替换一个匹配,(c)如果替换则返回true,否则返回false。
所以:
while ( <IN> )
{
if (s/<pattern1>:/<replace1>/ ||
s/<pattern2>:/<replace2>/) {
print FILE;
}
}
应该适合你。请注意,由于短路,只会进行一次替换。
答案 2 :(得分:0)
while ( <IN> )
{
s/^pattern:/myPattern:/;
print OUT
}
答案 3 :(得分:0)
这可能是你想要的:
$expr = "^(ab)|(cd)|(ef)|(gh)|(ij)";
while (<IN>)
{
if (/$expr:/)
{
s/$expr/$myPattern/;
print FILE;
}
}
答案 4 :(得分:0)
sub replacer {
$line = shift;
$find = shift;
$replace = shift;
$line =~ /([^:]+):/
if ($1 =~ /$find/) {
$line =~ s/([^:]+):/$replace/ ;
return $line;
}
return ;
}
while (<IN>)
{
print OUT replacer ($_,"mean","variance");
print OUT replacer ($_,"pattern","newPattern");
}
我的perl有点生疏,所以语法可能不准确。
编辑:将其放入ya函数中。
答案 5 :(得分:0)
执行上述要求的最简单方法是重复使用您的代码,但包括替换。
while ( <IN> )
{
print FILE if s/^(ab|bc|ef|gh):/MyPattern:/;
}
任何左侧图案都将被替换。如果左侧不匹配,则不会打印任何内容。