perl - 填充散列的散列 perl

标签 perl hash

我有以下哈希值:

my %MacroA = ('Category' => {}, 'Item' => {}, 'Description' => {}, 'Score' => {});

我想要的是遍历一个文件,然后将新元素添加到不同的哈希中。假设该行包含“布局”,我每次看到它时都想将其存储在“类别”中

我所做的是:

while (my $line = <$file>) {                                        

if ($line =~ /\b(layout)\b,/) { 
foreach my $categories (keys $MacroA{'Category'}) {
    $MacroA{Category} = $1;
}
}

最佳答案

您的问题非常令人困惑,但您的问题似乎是因为您在引用而不是哈希上执行 keys。较新的 perls 确实支持这一点,但您可能使用的是旧版本。

在您的示例中,$MacroA{'Category'} 返回哈希 reference,而不是哈希。您使用 'Category' => {} 初始化了散列,而 {} 是对空匿名散列的引用。

要将散列引用转换为散列,请使用 %{ ... } 表示法;在这种情况下,您将编写 keys %{ $MacroA{'Category'} }。是的,这很丑陋,这就是为什么 Perl 被更改为在引用上支持 keys

但是请注意,您的下一行是 $MacroA{Category} = $1; 它将用 $1 中的任何内容替换引用,可能是字符串 "布局”。这不是引用,所以下一次 while 循环时,你的脚本会崩溃。您可能想做一个多级哈希,例如 $MacroA{Category}{$1} = $file 或类似的东西,具体取决于您要在哈希中建立什么数据,但目前还不清楚您要达到的目标。另一个建议散列数组的答案可能是您想要的。在这种情况下,如果使用较旧的 perl,符号 @{ ... } 会将数组引用转换为可以与 push 一起使用的数组。

关于perl - 填充散列的散列 perl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13604802/

相关文章:

java - SHA-1 需要多长时间来创建哈希?

c# - ASP.NET 成员资格 HashAlgorithmType 默认为 HMACSHA256,那么密码散列是键控的吗?

perl - 合并来自不同文件的列

regex - Perl - 在逗号上拆分字符串。忽略空格

hash - 如何对使用rust 的单元结构执行 `Hash`?

hash - 如何在redis中 "EXPIRE" "HSET"子键?

python - 为字典实现自定义键,以便同一类的 2 个实例匹配

arrays - 如何对 Perl 数组进行分页?

perl - 在 Perl 中解析 Excel 文件的最佳方法是什么?

c - 如何在 Perl API 中内省(introspection)正则表达式