What's the difference between the built in ref($object)
and Scalar::Util
blessed($object)
? Is one preferred over the other?
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;
}
According to POD, blessed()
only works on blessed references (e.g. a references passed to a bless()
call).
It returns undef
on everything else, including hash/array refs where ref()
returns HASH
/ARRAY
(and a bunch of other types as delineated in perldoc ref). To get reference type you can, of course call Scalar::Util::reftype
.
As for whether one should be used over another, I think it depends largely on what the logic is.
If you only want to distinguish real blessed references from everything else, blessed()
provides a more concise way than taking a ref
and then verifying that the value is not on of standard ones returned by unblessed reference.
my $ref_type = ref($my_ref);
print "USING REF: ";
if ( $ref_type
&& $ref_type ne ref({})
&& $ref_type ne ref([])
&& $ref_type ne "SCALAR"
# Could also use a hash with all allowed values of ref() instead
&& $ref_type !~ /^(CODE|REF|GLOB|...)$) {
print "I am an object of class $ref_type\n";
} else {
print "I'm a reference of type $ref_type\n";
}
# vs...
print "USING SCALAR_UTIL: ";
my $ref_type = blessed($my_ref);
print $ref_type ? "I am an object of class $ref_type\n"
: "I am a reference of type " . reftype($my_ref) . "\n";
If you need fine distinctions between both blessed references and different ublessed ones, then a single ref()
call is more concise than a combination of blessed
and reftype
.
One edge case where there's an actual functional difference between the two approaches, as noted in the comments by Eric Strom, is when someone creates a class which matches one of ref()
hardcoded values (e.g. bless [], 'HASH'
- in which case they are either Way Dumb or Way Too Clever By Half).
my $sssft = bless [], 'HASH'; # sssft = someone_should_suffer_for_this
ref_description_using_ref($sssft);
ref_description_using_scalar_util($sssft);
# OUTPUT:
USING REF: I'm a reference of type HASH
USING SCALAR_UTIL: I am an object of class HASH
DISCLAIMER: Based on documentation, there should be no difference between the two when the argument is a reference blessed into a class (e.g. it returns class name). But I haven't checked "Scalar::Util" source to confirm.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With