内置ref($object)和Scalar::Util blessed($object)有什么不同?一个比另一个更受欢迎吗?
use strict;
use warnings;
use Scalar::Util qw(blessed isvstring);
my $object = foo->new();
print "Object is a " . blessed($object) . "\n";
print "Object is a " . ref($object) . "\n";
my $version = 5.00.03;
print "Version is a " . ref(\$version) . "\n";
if (isvstring($version)) {
print "Version is a VSTRING\n";
}
package foo;
sub new {
my $class = shift;
my $self = {};
bless($self, $class);
return $self;
}发布于 2010-12-10 05:00:07
根据POD的说法,blessed()只适用于有福的引用(例如,传递给bless()调用的引用)。
它对其他所有内容返回undef,包括散列/数组引用,其中ref()返回HASH/ARRAY (以及perldoc ref中描述的一堆其他类型)。要获取引用类型,当然可以调用Scalar::Util::reftype。
至于是否应该使用一个而不是另一个,我认为这很大程度上取决于逻辑是什么。
blessed()提供了一种更简洁的方法,而不是先获取一个ref,然后再验证值是否不在非有福引用返回的标准值上。my $ref_type = ref($my_ref);print "USING REF:";if ( $ref_type && $ref_type ne ref({}) && $ref_type ne ref([]) && $ref_type ne“标量”#也可以使用包含ref()的所有允许值的散列,而不是& $ref_type !~ /^(CODE|REF|GLOB|...)$) { print“我是类$ref_type\n的对象”;} else {打印"I'm a reference of type $ref_type\n";}# vs...打印"USING SCALAR_UTIL:";my $ref_type = blessed($my_ref);打印$ref_type?“我是$ref_type\n类的对象”:“我是类型的引用”。reftype类型($my_ref)。“\n”;
ref()调用比blessed和ref() hardcoded values的组合更简洁,在这两种方法之间有一个实际的功能差异,正如Eric Strom的评论中所指出的,当有人创建一个匹配ref()hardcoded values之一的类(例如bless [], 'HASH' -在这种情况下,他们要么是哑巴,要么是太聪明了一半)。my = $sssft [],' HASH ';# sssft = someone_should_suffer_for_this ref_description_using_ref($sssft);ref_description_using_scalar_util($sssft);#输出: USING REF: I是使用SCALAR_UTIL的类型HASH的引用:I是HASH类的对象
免责声明:根据文档,当参数是一个类的引用时,两者应该没有区别(例如,它返回类名)。但是我还没有检查"Scalar::Util“来源来确认。
https://stackoverflow.com/questions/4403013
复制相似问题