Perl:使用CSV拆分行元素作为哈希键无法读取对应值的问题
问题原因
- 键携带空白字符:输入CSV的每行开头存在缩进空格,调用
split分割后得到的第一列元素会包含前导空格,和哈希中定义的无空格键完全不匹配,导致无法命中对应值。 - 大小写不匹配:Perl哈希键是大小写敏感的,你输入文件中第二行的键为
ATFTP1-J(大写J),但哈希中定义的对应键为ATFTP1-j(小写j),二者不属于同一个键,自然无法返回正确值。 - 语法细节缺失:你提供的哈希定义末尾缺少分号,会直接触发语法报错(如果实际运行代码没有报错,可忽略该问题,大概率是粘贴时遗漏)。
解决方法
对读取到的原始键做两步标准化处理,再去哈希中查询即可:
- 移除键前后的所有空白字符(包括前导缩进、尾部空格、不可见制表符等)
- 将键统一转为小写/大写,和哈希定义的键规则保持一致
如果不想修改原有哈希的键定义,只要保证处理后的键和哈希键的大小写规则一致即可,以下是修改后的参考代码:
my %Ctct2Bob = ( "ATFTP1-a" => "24", "ATFTP1-b" => "25", "ATFTP1-j" => "100", "ATFTP1-m" => "33", ); # 补全哈希定义末尾的分号 while( my $line = <IN> ){ chomp $line; my @linestuff = split(',', $line); # 处理原始键 my $raw_key = $linestuff[0]; $raw_key =~ s/^\s+|\s+$//g; # 移除前后所有空白 my $key = lc($raw_key); # 统一转小写 # 把首字母后面的J转为小写匹配哈希规则,也可直接修改哈希键为大写保证匹配 $key =~ s/(?<=ATFTP1-)(.)/lc($1)/e; # 按要求输出内容 print "$linestuff[0],$Ctct2Bob{$key}"; shift @linestuff; # 移除已经处理的第一列 print join(',', @linestuff) . "\n"; }
内容的提问来源于stack exchange,提问作者M.O. Kitzka
相关产品推荐
相关产品推荐

