如何在perl中发现对象类型?
情景:如何在perl中发现对象类型?,perl,Perl,情景: 有几个对象,它们是从My::Module和Path::Class等创建的 每个对象都可以通过调用特定方法返回一些字符串值 需要构建一个HashRef,其中值是字符串 比如(非常简短): 在实际代码中,filename和myobj是用Moose定义的,如: has 'myobj' => (isa => 'My::Module', builder => ... ...); 但是,在这种情况下,我做一些驼鹿式的深度强制比做一个简单的make_stringfilter s
- 有几个对象,它们是从
和My::Module
等创建的Path::Class
- 每个对象都可以通过调用
特定方法返回一些字符串值
- 需要构建一个
,其中HashRef
值是字符串
filename
和myobj
是用Moose定义的,如:
has 'myobj' => (isa => 'My::Module', builder => ... ...);
但是,在这种情况下,我做一些驼鹿式的深度强制
比做一个简单的make_string
filter sub复杂得多。但是,我愿意接受任何推荐的解决方案
因此,问题是-如何发现$val
是什么对象,或者它是否是一个简单的Str
编辑:
根据@David W.的评论,我得到了下一个:
sub make_string {
my($self, $val) = @_;
my $vref = ref $val; #for the "text" returns the string itself
return $val->stringify if( $vref =~ /^Path::Class/ ); #works
return $val->stringvalue if( $vref =~ /^My::Module/ ); #works
return $val if( VAL_IS_SIMPLE_STRING ); #returns the string itself, so how to check this???
croak "unknown value";
}
使用
isa
方法。它在通用软件包中定义(请参见perldoc UNIVERSAL
)。所有Perl类都隐式继承自UNIVERSAL
use Scalar::Util qw( blessed );
if (blessed($val) and $val->isa('Path::Class')) {
print "It's a Path::Class object!\n";
}
有一个名为的Perl函数将返回对象类型,如果它是对受祝福对象的引用,则返回对象名称。有一个类似的函数,名为
祝福
,它将返回对象类型,与ref
不同,它只返回祝福对象类型。这两种方法对你都有效吗?不要使用ref
。如果有人创建Path::class的子类,您的代码将无法识别它。
use Scalar::Util qw( blessed );
if (blessed($val) and $val->isa('Path::Class')) {
print "It's a Path::Class object!\n";
}