1

次のコードで「Not a HASH reference」というエラーが表示されます。クラスのメンバー変数であるハッシュ参照に存在することをテストする適切な方法は何ですか?

package TestClass;

sub new {
    my ($class) = @_;

    my $self = {
        _ht => \{}
    };

    bless $self, $class;
    return $self;
}

sub itemExists {
    my ($self, $key) = @_;
    my $itemExists = 0;

    if(exists $self->{_ht}->{$key}) { # ERROR HERE: Not a HASH reference
        $itemExists = 1;
    }

    return $itemExists;
}

1;

# ------------------------------------------
package Main;

my $t = new TestClass();
$t->itemExists('A')
4

2 に答える 2

6

コンストラクターで、hashref への参照である に初期化$self->{_ht}しました。\{}に変更します

sub new {
    my ($class) = @_;

    my $self = {
        _ht => {}   # backslash removed
    };

    bless $self, $class;
    return $self;
}
于 2012-05-23T19:58:47.403 に答える
6

$self->{_ht}ハッシュへの参照ではありません。スカラーへの参照です。そのスカラーはハッシュへの参照です。

あなたがしたい:

my $self = {
    _ht => \{},
};

if (exists ${ $self->{_ht} }->{$key})  # Scalar deref added

または、より可能性が高い:

my $self = {
    _ht => {},  # Ref to scalar removed
};

if (exists $self->{_ht}->{$key})
于 2012-05-23T19:59:11.650 に答える