Perl一次搜索并替换多个字符串

Perl一次搜索并替换多个字符串,perl,Perl,我有下面的Perl代码,它工作时没有任何错误。我想知道是否有可能一次完成foreach循环中的四个替换,并删除与第五个替换匹配的整行。 我不理解到目前为止我所经历的建议解决方案,我正在尝试避免使用散列。 我将非常感激 #!/usr/bin/perl -w use strict; use warnings; my @data=<DATA&g

我有下面的Perl代码,它工作时没有任何错误。我想知道是否有可能一次完成foreach循环中的四个替换,并删除与第五个替换匹配的整行。 我不理解到目前为止我所经历的建议解决方案,我正在尝试避免使用散列。 我将非常感激

#!/usr/bin/perl -w
use strict;
use warnings;
                                                                            
my @data=<DATA>;
foreach $lines (@data){
$lines =~ s/\//9/g;
$lines =~ s/333/33300/g;
$lines =~ s/555/55500/g;
$lines =~ s/=|==//g;
$lines =~ s/NIL|N I L//g;       # preferably delete this whole line
}

print "@lines\n";
exit 0;


__DATA__
63740 32575 40606 10217 20159 48528 83230 333 20/// 59008 83820=
63820 32580 20803 10305 20225 40130 82200 333 20262 59009 82823==
63135 NIL=
63742 12570 10507 10208 20148 48509 60014 81100 333 20155 59012 81820=
#/usr/bin/perl-w
严格使用;
使用警告;
我的@data=;
foreach$行(@data){
$lines=~s/\//9/g;
$lines=~s/333/33300/g;
$lines=~s/555/55500/g;
$lines=~s/=|==///g;
$lines=~s/NIL | N I L//g;#最好删除整行
}
打印“@lines\n”;
出口0;
__资料__
63740 32575 40606 10217 20159 48528 83230 333 20/// 59008 83820=
63820 32580 20803 10305 20225 40130 82200 333 20262 59009 82823==
63135零=
63742 12570 10507 10208 20148 48509 60014 81100 333 20155 59012 81820=
我的%map=(
'/'   => '9',
'333' => '33300',
'555' => '55500',
'='   => '',
);
my$pat=join'|',map quotemeta,键(%map);
我的$re=qr/($pat)/;
而(){
下一个if/NIL/;
s/$re/$map{$1}/g;
印刷品;
}

上述方法之所以有效,是因为匹配的字符串是转换映射的键。但您要添加以下内容:

s/^.*NIL.*\z//
没有简单的方法来处理这个问题。但我们可以专门处理这个案子

my%map=(
'/'   => '9',
'333' => '33300',
'555' => '55500',
'='   => '',
);
my$pat=join'|',map quotemeta,键(%map);
我的$re=qr/^.*NIL.*\z |($pat)/;
而(){
s/$re/defined($1)?$map{$1}:“/eg;
印刷品;
}
这是丑陋的,虽然可能更快。更快的方法是将整个文件加载到内存中

my%map=(
'/'   => '9',
'333' => '33300',
'555' => '55500',
'='   => '',
'=='  => '',
);
my$pat=join'|',map quotemeta,键(%map);
我的$re=qr/^.*NIL.*\n?|($pat)/m;
本地$/;
而(){
s/$re/defined($1)?$map{$1}:“/eg;
印刷品;
}

非常感谢@ikegami,这正是我想要的。我感谢你的时间和努力。很抱歉回到你身边@ikegami。答案很好,但当我从一个文件读取数据并将修改后的数据写入另一个文件时,我遇到了一个小问题。print语句打印修改后的数据ok,但每行都以GLOB(0x56544d5f41e0)开头。当我添加“print$OUT\u F”时。如果文件名为OUT,则该文件为空。我所做的唯一更改是while循环中的“while(){”和“print$OUT\F”。@Zilore Mumba我认为print语句应该是
print$OUT\F$”
print$OUT\F$。“\n”;
print
print$\u
的缩写,但
print$var
不是
print$var$\u
的缩写。如果要将
$\u
打印到句柄,需要明确地指定它,因为它工作得很好。