perl 按名称引用程序包

s4chpxco  于 2022-01-26  发布在  Perl
关注(0)|答案(1)|浏览(165)

请考虑:

#!/usr/bin/perl

use strict;
use warnings;

package base
{
    sub new()
    {
        my $class = shift( @_ );
        my $self = {};
        bless( $self, $class );
    }
}

package myclass
{
    our @ISA = 'base';
}

package main;

my $classname = 'myclass';
print( ( $classname->can( 'new' ) ) ? "can" : "cannot" );

print( "\n" );

print( @myclass::ISA );

我知道在一个文件中有多个包并不完全是“干净的Perl”。
我感兴趣的是最后几行。

my $classname = 'myclass';
print( ( $classname->can( 'new' ) ) ? "can" : "cannot" );

这里,我可以使用存储在classname中的包的 name 来“检查”该包,而无需示例化包/类。

print( @myclass::ISA );

在这里,我“检查”了一个包的ISA数组......但是直接命名了这个包。
是否也有方法引用包的ISA$classname

2ic8powd

2ic8powd1#

这是可能的没有严格的参:

say join ' ', do { no strict 'refs'; @{ "$classname" . '::ISA' } };

或者你可以使用mro::get_linear_伊萨来获取所有的祖先(即@ISA的传递闭包):

use mro;
say join ' ', @{  mro::get_linear_isa($classname) };

但这并不是你通常需要的,在实践中,你想知道一个类是否继承自一个给定的类,这可以使用通用的isa方法来实现:

say $classname->isa('base');  # 1

同样,这将检查传递关系,而不仅仅是direct @伊萨成员关系。

相关问题