perl - 在 Perl 中存储 1key - 3 value 的最佳方法是什么?

标签 perl hash

我有一种情况,每个键有 3 个不同的值。我必须像这样打印数据:

K1 V1 V2 V3
K2 V1 V2 V3
…
Kn V1 V2 V3

除了下面列出的以外,是否还有其他更有效、更简单的方法来实现这一点?我正在考虑两种方法:

  1. 为每个键的 3 个不同值维护 3 个哈希值。 根据键遍历一个散列并从其他 2 个散列中获取值 并打印出来。

    Hash 1 - K1-->V1 ...
    Hash 2 - K1-->V2 ...
    Hash 3 - K1-->V3 ...
  2. 使用键维护单个散列以引用值数组。 这里我需要迭代并只读取 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 引用您的 V1V2V3,或者如果你永远不想单独处理它们的值。

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/

相关文章:

git - 无法在 Windows 中运行 git svn 命令

Perl,获取所有哈希值

Python递归打印嵌套哈希

php - password_verify 和 doveadm pw -t 如何在不加盐的情况下验证密码

android - UnknownError : ApiException:Key hash **** does not match. .. 当我安装 FB 应用程序时

perl - 使用 Perl 匹配模式的 SCP 文件

perl - 如何仅在您指定的某个任意字段上进行正则表达式替换

perl - 是否有使 Moose 属性显示在 Tag_List 中的 vim 插件?

ruby 将数组转换为哈希保留重复键

python - 从 Perl 调用 Node.js(或 python)