Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在perl中发现对象类型?_Perl - Fatal编程技术网

如何在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";
}