我正在尝试覆盖我创建的类的相等(==)运算符,但我现在面临一个问题而且我没有看到出路。任何帮助将不胜感激。
这是该类的new()
子:
sub new
{
my $invocant = shift;
my $class = ref($invocant) || $invocant;
my $self = {@_};
bless($self, $class);
return $self;
}
这是等于运算符重载:
use overload ('==' => \&compare);
sub compare
{
my ($lhs, $rhs, $swap) = @_;
my $lhsSize = keys(%{$lhs});
my $rhsSize = keys(%{$rhs});
if($lhsSize != $rhsSize) { return 0; } # If objects don't have the same number of fields, they cannot be identical
while (my ($lhsKey, $lhsValue) = each(%{$lhs})) # Loop through the fields
{
my $rhsValue = %{$rhs}->{$lhsKey};
print("Key: $lhsKey Comparing $lhsValue with $rhsValue");
if($rhsValue ne $lhsValue)
{
return 0;
}
}
return 1;
}
我收到错误Using a hash as a reference is deprecated at Cashflow.pm line 43.
,其中第43行是my $rhsValue = %{$rhs}->{$lhsKey};
。然后我发现this thread表示解决方案是删除->
,但如果我将行更改为my $rhsValue = %{$rhs}{$lhsKey};
,则会出现语法错误。
正如你可能会说的那样,我不是Perl专家,但我不明白为什么这不起作用。
提前感谢您的帮助。
标记
答案 0 :(得分:4)
解决方案是(可能)删除散列取消引用%{ ... }
my $rhsValue = $rhs->{$lhsKey};
使用%{ ... }
取消引用哈希的唯一原因是,如果您想要一个项目列表,例如在制作副本时:
my %hash = %$rhs;
或者使用某些哈希特定功能时
keys %$rhs;
答案 1 :(得分:2)
错误发生在while
循环中:
my $rhsValue = %{$rhs}->{$lhsKey};
错误是因为$rhs
是一个有福的哈希引用,应该像这样访问:
my $rhsValue = $rhs->{$lhsKey}; # or $$rhs{$lhsKey}
所以我会这样:
while (my ($lhsKey, $lhsValue) = each(%{$lhs})) # Loop through the fields
{
return 0 if ! defined $rhs->{$lhsKey};
my $rhsValue = $rhs->{$lhsKey};
return 0 if $rhsValue ne $lhsValue;
}
答案 2 :(得分:1)
如果是
%hash
$hash{$key}
对于哈希,它是
%{ $hash_ref }
${ $hash_ref }{$key}
用于哈希引用。对于简单的引用表达式,curlies是可选的。
%$hash_ref
$$hash_ref{$key}
您也可以将后者写成
$hash_ref->{$key}
%{$rhs}->{$lhsKey}
没有意义,因为哈希等效项中没有%
($rhs{$lhsKey}
)。
参考文献: