我有以下哈希值:
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/