具有拆分和选择列的perl哈希映射/检索问题

具有拆分和选择列的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',

另外,这个问题与上述问题的答案有关

当我尝试替换此代码时:

片段-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',
          '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的。