Perl - 无法为子类创建类变量

时间:2011-09-05 10:28:18

标签: perl

我正在创建一个基类为Net::SSH2的子类。当我试图添加一个类变量时,我收到错误说 -

  

不是F:\ temp \ fooA.pl第17行的HASH引用。

如果我在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 个答案:

答案 0 :(得分:5)

这很简单:Net :: SSH2不会返回散列引用,但是有一个祝福的标量:

use Scalar::Util qw(reftype);
print reftype($self) . "\n";  # SCALAR
BTW:依赖第三方代码的实施细节总是很危险。

一种可能的解决方案是使用内外对象:

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;
}