这实际上取决于您想对数据做什么,尽管我无法想象您的选项 1 对任何事情都很方便。
如果您乐于使用索引 0、1、2引用您的V1
, V2
,或者如果您真的不想单独处理它们的值,请使用数组哈希。V3
my %data;
$data{K1}[0] = V1;
$data{K1}[1] = V2;
$data{K1}[2] = V3;
或者,当然
$data{K1} = [V1, V2, V3];
作为一个附加选项,如果您的值意味着可命名的东西,您可以使用哈希哈希,所以
my %data;
$data{K1}{name} = V1;
$data{K1}{age} = V2;
$data{K1}{height} = V3;
或者
$data{K1}{qw/ name age height /} = (V1, V2, V3);
最后,如果您永远不需要访问单个值,则可以将它们保留在文件中,就像这样
my %data;
$data{K1} = "V1 V2 V3";
但正如我所说,内部存储主要取决于您希望如何访问数据,而您还没有告诉我们这一点。
编辑
既然你说
主要挑战是,V1、V2、V3 的值是在不同的地方导出的,不能作为数组推到一起
我认为散列的散列可能更合适,但我一点也不担心取消引用,因为就执行时间而言,它是一个微不足道的操作。但我不会使用push
它,因为这会限制您以正确的顺序添加数据。
根据您的喜好,您可以选择
$data{K1}[2] = V3;
或者
$data{K1}{height} = V3;
显然后者更具可读性。
编辑 2
根据要求,要按第三个值(在我的示例中)对哈希值进行排序,height
您可以编写
use strict;
use warnings;
my %data = (
K1 => { name => 'ABC', age => 99, height => 64 },
K2 => { name => 'DEF', age => 12, height => 32 },
K3 => { name => 'GHI', age => 56, height => 9 },
);
for (sort { $data{$a}{height} <=> $data{$b}{height} } keys %data) {
printf "%s => %s %s %s\n", $_, @{$data{$_}}{qw/ name age height / };
}
或者,如果数据存储为数组的散列
use strict;
use warnings;
my %data = (
K1 => [ 'ABC', 99, 64 ],
K2 => [ 'DEF', 12, 32 ],
K3 => [ 'GHI', 56, 9 ],
);
for (sort { $data{$a}[2] <=> $data{$b}[2] } keys %data) {
printf "%s => %s %s %s\n", $_, @{$data{$_}};
}
两个脚本的输出是相同的
K3 => GHI 56 9
K2 => DEF 12 32
K1 => ABC 99 64