我有一种情况,每个键有 3 个不同的值。我必须像这样打印数据:
K1 V1 V2 V3 K2 V1 V2 V3 … Kn V1 V2 V3
除了下面列出的以外,是否还有其他更有效、更简单的方法来实现这一点?我正在考虑两种方法:
为每个键的 3 个不同值维护 3 个哈希值。 根据键遍历一个散列并从其他 2 个散列中获取值 并打印出来。
Hash 1 - K1-->V1 ... Hash 2 - K1-->V2 ... Hash 3 - K1-->V3 ...
使用键维护单个散列以引用值数组。 这里我需要迭代并只读取 1 个哈希。
K1 --> Ref{V1,V2,V3}
编辑1:
主要的挑战是,值 V1、V2、V3 是在不同的地方导出的,不能作为数组推到一起。因此,如果我将散列值作为对数组的引用,则每次我想添加下一个值时都必须取消对它的引用。
例如,我在 subroutine1 - 我填充了 Hash1 - K1-->[V1]
我在 subroutine2 - 我必须取消引用 [V1]
,然后按 V2
。所以现在哈希
变成K1-->[V1 V2]
,V3
在另一个例程中加入。 K1-->[V1 V2 V3]
编辑2:
现在我面临着另一个挑战。我必须根据 V3
对散列进行排序。
用键和列表引用存储散列仍然可行吗?
K1-->[V1 V2 V3]
最佳答案
这实际上取决于您想如何处理您的数据,尽管我无法想象您的选项 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";
但正如我所说,内部存储主要取决于您希望如何访问数据,而您还没有告诉我们。
编辑
既然你说了
The main challenge is that, the values V1, V2, V3 are derived at different places and cannot be pushed together as the array
我认为也许哈希的哈希更合适,但我完全不担心取消引用,因为就执行时间而言,这是一个微不足道的操作。但我不会使用 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
关于perl - 在 Perl 中存储 1key - 3 value 的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10284508/