You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:41:54