【发布时间】:2014-04-23 08:12:43
【问题描述】:
Perl find and replace multiple(huge) strings in one shot
P.S.这个问题与上述问题的答案有关。
当我尝试替换此代码时:
Snippet-1
open my $map_fh, '<', 'map.csv' or die $!;
my %replace = map { chomp; split /,/ } <$map_fh>;
close $map_fh;
使用此代码:
Snippet-2
my %replace = map { chomp; (split /,/)[0,1] } <$map_fh>;
即使键存在(如在转储程序中),exists 语句也不会返回键的值。
对于相同的输入文件,它仅适用于单独拆分(Snippet-1),而当我在拆分后选择特定列时不返回任何内容(Snippet-2)。
这里是否发生了一些整数/字符串数据类型的混乱?
输入映射文件
483329,Buffalo
483330,Buffalo
483337,Buffalo
脚本输出
$VAR1 = {
'483329' => 'Buffalo',
'46546' => 'Chicago_CW',
'745679' => 'W. Washington',
};
1 search is ENB
2 search is 483329 **expected Buffalo here**
3 search is 483330
4 search is 483337
Perl 代码
open my $map_fh, '<', $MarketMapFile or die $!;
if ($MapSelection =~ /eNodeBID/i) {
my %replace = map { chomp; (split /,/)[0,1] } <$map_fh>;
use Data::Dumper;
print Dumper(\%replace);
}
close $map_fh;
my $csv = Text::CSV->new({ binary => 1, auto_diag => 1, eol => $/,quote_space => 0 });
my $tmpCSVFile = $CSVFile."tmp";
open my $in_fh, '<', $CSVFile or die $!;
open my $out_fh, '>', $tmpCSVFile or die $!;
my $cnt=1;
while (my $row = $csv->getline($in_fh)) {
my $search = $row->[5];
$search =~ s/[^[:print:]]+//g;
if ($MapSelection =~ /eNodeBID/i) {
$search =~ s/(...)-(...)-//g;
$search =~ s/\(M\)//g;
}
my $match = (exists $replace{$search}) ? $replace{$search} : undef;
print "\n$cnt search is $search ";
if (defined($match)) {
$match =~ s/[^[:print:]]+//g;
print "and match is $match";
}
push @$row, $match;
#print " match is $match";
$csv->print($out_fh, $row);
$cnt++;
}
# untie %replace;
close $in_fh;
close $out_fh;
【问题讨论】:
-
请清楚您要替换的内容。它只是您要替换的一行,还是整个 sn-p 1?
-
@mareoraft 就一行
-
能否也给$MapSelection的输入值?
-
很高兴看到 Snippet1 和 Snippet2 的脚本输出。现在只有其中一个,我假设是用于 Snippet2。