使用哈希引用时出现严格的引用错误



我包含的代码已经验证说明了我的问题。我的目标是将从此处模拟的数据库查询返回的哈希作为 %r(其中包含数字索引),并使用"name"字段的值作为接收哈希中的键。(此哈希将包含来自多个查询的结果。

我觉得我很可能在引用和取消引用方面做了一些愚蠢的事情。我真的很想尝试在这里掌握工作的概念。谢谢!

#!/usr/bin/perl -T
use strict;
use warnings;
my %hash;
my %r = (
'1' => {
name => 'Harry',
desc => 'Prince',
},
);
MergeHash(%hash,%r);
foreach my $name (keys %hash) {
print "name = $name, desc = $hash{$name}{desc}n"; # EDIT: REVISED
}
exit;
sub MergeHash {
my $h = shift; # reference to receiving hash
my $r = shift; # reference to giving hash
foreach my $i (keys %{$r}) {
$$h{name} = $$r{$i}{name} || 'Unknown'; # okay
$$h{name}{desc} = $$r{$i}{desc} || 'Unknown'; # Can't use string ("Harry") as a HASH ref while "strict refs" in use at ./test.pl line 25.
}
}

编辑:根据要求,输出(在上面的代码中也指示为注释):

Can't use string ("Harry") as a HASH ref while "strict refs" in use at ./test.pl line 25.

编辑#2:修改了打印行(在上面的代码中),以明确%hash中所需的结构。

$$h{name}{desc}

更清楚地写成

$h->{name}{desc}

这是

$h->{name}->{desc}

更清楚地表明,$h->{name}的值被用作哈希引用(就像$h的值一样),但它包含一个字符串。


您需要做的就是将name替换为实际名称,因为这就是您想要的密钥。

for my $i (keys(%$r)) {
$h->{ $r->{$i}{name} }{desc} = $r->{$i}{desc};
}

我们实际上不需要$i,所以让我们简化一下。

for my $row (values(%$r)) {
$h->{ $row->{name} }{desc} = $row->{desc};
}

上述问题在于它不适合每行多个字段。下面更好地处理这个问题:

for my $row (values(%$r)) {
$h->{ $row->{name} } = {
desc => $row->{desc},
# ...
};
}

购买为什么要构建一个新的哈希值,而我们已经拥有的哈希值可以?

for my $row (values(%$r)) {
$h->{ $row->{name} } = $row;
}

如果要使用给定哈希中的所有数据覆盖接收哈希的成员,则以下代码将起作用。

sub MergeHash {
my $h = shift; # reference to receiving hash
my $r = shift; # reference to giving hash
while (my ($k, $v) = each %$r) {
$h->{$k} = $v;
}
}

问题是 $$h 假设$h是对 SCALAR 的引用,而它不是,它是对 HASH 的引用,您通常会看到人们取消引用哈希,同时引用它的成员之一,就像我上面所做的那样。另一种方法是像这样声明哈希的副本,但这不适用于您的用例:

my %copyofh = %$h;

相关内容

  • 没有找到相关文章

最新更新