考慮:
#!/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來“檢查”該包,而無需實體化包/類。
print( @myclass::ISA );
在這里,我“檢查”了一個包的ISA陣列……但直接命名包。
有沒有辦法參考包的ISA通過$classname?
uj5u.com熱心網友回復:
沒有嚴格的參考是可能的:
say join ' ', do { no strict 'refs'; @{ "$classname" . '::ISA' } };
或者您可以使用mro::get_linear_isa來獲取所有祖先(即@ISA 的傳遞閉包):
use mro;
say join ' ', @{ mro::get_linear_isa($classname) };
但這不是您通常需要的。在實踐中,您想知道一個類是否繼承自給定類,這可以使用通用isa方法:
say $classname->isa('base'); # 1
同樣,這會檢查傳遞關系,而不僅僅是直接的@ISA 成員資格。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/513187.html
標籤:perl包裹
