Perl:在重载的相等sub中迭代类成员变量

时间:2013-10-25 12:54:25

标签: perl operators operator-overloading equality

我正在尝试覆盖我创建的类的相等(==)运算符,但我现在面临一个问题而且我没有看到出路。任何帮助将不胜感激。

这是该类的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专家,但我不明白为什么这不起作用。

提前感谢您的帮助。

标记

3 个答案:

答案 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})。

参考文献: