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')
Другие вопросы по тегам