使用Perl的map将文件内容读取到哈希时遇到的问题
你的问题出在这两个地方,我给你拆解下:
首先,咱们看你的文件行格式是A|A1 B|B1 C|C1,每一行里有多个用空格分隔的键值对单元,你现在的代码直接对整行用split /\|/,会把整行拆成('A', 'A1 B', 'B1 C', 'C1')这种混乱的列表,赋值给哈希的时候就会变成A => 'A1 B', 'B1 C' => 'C1',完全不是你想要的键值对。
其次,你调用print Dumper %attribhash;的时候,Perl会把哈希展开成键值对的列表,Data::Dumper会把这些列表元素当作单独的变量来打印,自然不会显示成哈希结构——你得传哈希的引用\%attribhash才行。
修正后的代码(可读性优先版):
use strict; use warnings; use Data::Dumper; my $instAttribFileName = "DATABYIDENTIFIER_InstCommonAttrList.config"; # 用词法文件句柄代替老式裸句柄,是Perl最佳实践 open(my $IFH, '<', $instAttribFileName) or die "cannot open file: $!"; my %attribhash = (); while (my $line = <$IFH>) { chomp $line; # 先把行按空格拆成多个"键|值"的独立单元 my @pairs = split /\s+/, $line; # 对每个单元拆分键和值,添加到哈希 foreach my $pair (@pairs) { my ($key, $value) = split /\|/, $pair; # 加个判断避免空键空值的情况 $attribhash{$key} = $value if defined $key && defined $value; } } close $IFH; # 传哈希引用给Dumper,才能正确打印哈希结构 print Dumper(\%attribhash);
或者用更简洁的map写法:
use strict; use warnings; use Data::Dumper; my $instAttribFileName = "DATABYIDENTIFIER_InstCommonAttrList.config"; open(my $IFH, '<', $instAttribFileName) or die "cannot open file: $!"; my %attribhash = map { chomp; # 先拆分行成单个键值对单元,再逐个拆分键和值 map { split /\|/ } split /\s+/; } <$IFH>; close $IFH; print Dumper(\%attribhash);
这里内层的split /\s+/先把每一行拆成独立的键值对单元,每个单元再用split /\|/拆成键和值,整个map返回的就是完整正确的键值对列表,能完美填充哈希。
内容的提问来源于stack exchange,提问作者BVAD
相关产品推荐
相关产品推荐

