Perl - Невозможно создать переменную класса для дочернего класса - PullRequest
4 голосов
/ 05 сентября 2011

Я создаю дочерний класс, базовый класс которого равен Net::SSH2.когда я пытаюсь добавить переменную класса, я получаю сообщение об ошибке:

Не ссылка HASH в строке F: \ temp \ fooA.pl 17.

Я делаю то же самое без Net::SSH2, тогда все работает нормально.

Вот код:

use strict;

my $x = Foo->new();

package Foo;

use base qw (Net::SSH2);

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

    my $self = $class->SUPER::new(%args);
    $self->{'key'} = 'value';
    bless $self, $class;
    return $self;
}

1 Ответ

5 голосов
/ 05 сентября 2011

Все просто: Net :: SSH2 не возвращает ссылку на хеш, но благословенный скаляр:

use Scalar::Util qw(reftype);
print reftype($self) . "\n";  # SCALAR

Кстати: всегда опасно полагаться на детали реализации стороннего кода.

Возможное решение - использовать наизнанку объекты:

package Foo;

use Scalar::Util qw( refaddr );
use base qw( Net::SSH2 );

my %keys;

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

    my $self = $class->SUPER::new ( %args );

    $keys{ refaddr ( $self ) } = 'value';

    bless $self, $class;
    return $self;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...