1

作成したクラスの等価 (==) 演算子をオーバーライドしようとしていますが、現在問題に直面しており、解決方法がわかりません。どんな助けでも大歓迎です。

クラスの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};。次に、解決策はを削除することを示唆するこのスレッドを見つけました->が、行を変更するmy $rhsValue = %{$rhs}{$lhsKey};と構文エラーが発生します。

お分かりかもしれませんが、私は Perl の専門家ではありませんが、なぜこれが機能しないのかわかりません。

助けてくれてありがとう。

マーク

4

3 に答える 3

4

解決策は(おそらく)ハッシュ逆参照を削除することです%{ ... }

my $rhsValue = $rhs->{$lhsKey};

を使用してハッシュに逆参照する唯一の理由%{ ... }は、コピーを作成するときなど、アイテムのリストが必要な場合です。

my %hash = %$rhs;

または、特定のハッシュ固有の関数を使用する場合

keys %$rhs;
于 2013-10-25T13:01:02.400 に答える
1

もし

%hash
$hash{$key}

ハッシュの場合、それは

%{ $hash_ref }
${ $hash_ref }{$key}

ハッシュ参照用。単純な参照式の場合、カーリーはオプションです。

%$hash_ref
$$hash_ref{$key}

後者は次のように書くこともできます

$hash_ref->{$key}

%{$rhs}->{$lhsKey}%同等のハッシュ ( ) にno がないため、意味がありません$rhs{$lhsKey}

参考文献:

于 2013-10-25T15:24:16.923 に答える