Perl: элегантный способ проверить, является ли объект благословенным как пакет?
Я хочу проверить, если $thing
объект благословлен как пакет (например, __PACKAGE__
). Одна идея заключается в следующем:
use Scalar::Util qw(blessed);
defined blessed $thing && blessed $thing eq __PACKAGE__
Есть ли лучший и / или более элегантный способ избежать проверки, если возвращаемое значение blessed
определено?
Другой подход (blessed $thing or '') eq __PACKAGE__
, но я не уверен, может ли пакет по закону быть пустым или нет.
Кроме того, на основе Perl Monks, UNIVERSAL::isa($thing, __PACKAGE__)
это другой способ, но этот подход допускает больше вещей.
2 ответа
Вы можете использовать предопределенный ref
функция:
ref($thing) eq __PACKAGE__
Тем не менее, я думаю, что более разрешительныйisa
действительно лучше практиковать. Как правило, вам не нужно проверять, является ли тип объекта чем-то подобным.
[…] Я не уверен, может ли пакет по закону быть пустым или нет.
Это не может. (И, кстати, если вы попытаетесь благословить ссылку на ''
, это на самом деле будет благословен в main
, Perl предупредит вас об этом, если у вас есть -w
или же use warnings
.)
Использовать Safe::Isa
модуль из CPAN:
$possible_object->$_isa('DateTime')