2011-09-05 59 views
4

我正在创建基类为Net::SSH2的子类。当我尝试添加类变量,我得到错误说 -Perl - 无法为子类创建类变量

不以F散列引用:\ TEMP \ fooA.pl线17

如果我做同样的事情wihtout 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; 
} 

回答

5

很简单:网:: 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; 
} 
+0

...或只是'$自我 - > { '超级'} = $类 - > SUPER ::新(%参数)' – tripleee