具有拆分和选择列的perl哈希映射/检索问题
另外,这个问题与上述问题的答案有关 当我尝试替换此代码时: 片段-1具有拆分和选择列的perl哈希映射/检索问题,perl,hashmap,Perl,Hashmap,另外,这个问题与上述问题的答案有关 当我尝试替换此代码时: 片段-1 open my $map_fh, '<', 'map.csv' or die $!; my %replace = map { chomp; split /,/ } <$map_fh>; close $map_fh; 脚本输出 $VAR1 = { '483329' => 'Buffalo', '46546' => 'Chicago_CW',
open my $map_fh, '<', 'map.csv' or die $!;
my %replace = map { chomp; split /,/ } <$map_fh>;
close $map_fh;
脚本输出
$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代码
483329,Buffalo
483330,Buffalo
483337,Buffalo
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;
打开我的$map\u fh,你的范围有问题。您的代码:
if ($MapSelection =~ /eNodeBID/i) {
my %replace = map { chomp; (split /,/)[0,1] } <$map_fh>;
use Data::Dumper;
print Dumper(\%replace);
}
将use strict
和use warnings
放在代码顶部,可以帮助您发现这些问题
另外,您可以只使用my$match=$replace{$search}
,因为它相当于您的?:
操作。您的范围有问题。您的代码:
if ($MapSelection =~ /eNodeBID/i) {
my %replace = map { chomp; (split /,/)[0,1] } <$map_fh>;
use Data::Dumper;
print Dumper(\%replace);
}
将use strict
和use warnings
放在代码顶部,可以帮助您发现这些问题
另外,您可以只使用my$match=$replace{$search}
,因为它相当于您的?:
操作。始终包括并位于每个perl脚本的顶部。如果您做到了这一点,并且一直保持良好的编码实践,声明变量,您可能会遇到以下错误:
Global symbol "%replace" requires explicit package name at
这会让您知道您的代码存在范围问题。避免这种情况的一种方法是在%replace
my %replace = ($MapSelection =~ /eNodeBID/i)
? map { chomp; (split /,/)[0,1] } <$map_fh>
: ();
my%replace=($MapSelection=~/eNodeBID/i)
? 映射{chomp;(split/,/)[0,1]}
: ();
始终包括并位于每个perl脚本的顶部。如果您做到了这一点,并且一直保持良好的编码实践,声明变量,您可能会遇到以下错误:
Global symbol "%replace" requires explicit package name at
这会让您知道您的代码存在范围问题。避免这种情况的一种方法是在%replace
my %replace = ($MapSelection =~ /eNodeBID/i)
? map { chomp; (split /,/)[0,1] } <$map_fh>
: ();
my%replace=($MapSelection=~/eNodeBID/i)
? 映射{chomp;(split/,/)[0,1]}
: ();
请清楚您要更换的是什么。这只是您要替换的一行,还是整个代码段1?@mareoraft只有一行您还可以给出$MapSelection的输入值吗?最好同时看到代码段1和代码段2的脚本输出。现在只有一个,我假设是针对Snippet2的。请明确您要替换的内容。这只是您要替换的一行,还是整个代码段1?@mareoraft只有一行您还可以给出$MapSelection的输入值吗?最好同时看到代码段1和代码段2的脚本输出。现在只有一个,我假设是针对Snippet2的。