#perl #object
#perl #объект
Вопрос:
В моем скрипте у меня есть что-то вроде
my $region = $self->Functiontofind( $tag );
my $value1 = $region->getValue1;
my $value2 = $region->getValue2;
$region — это объект, в некоторых случаях $region может быть пустым, то есть, если тег пуст, я хочу выполнить проверку, чтобы увидеть, является ли объект пустым или нет. Как мы можем это сделать.
if (defined ($region))
похоже, не работает.
Спасибо,
Комментарии:
1. Что именно с точки зрения реализации вы имеете в виду, что
$region
может быть пустым? Мы сможем дать вам полезный ответ быстрее всего, если вы отредактируете свой вопрос, включив в него определениеFunctiontofind
.2. «не работает» — это довольно расплывчато. Что вы получаете и чего ожидаете?
Ответ №1:
Вы должны проверить, какие значения могут быть возвращены Functiontofind
, это может быть так: 0 = ошибка, 1 = успех и т.д.
как уже упоминалось, в идеале, его undef
для не созданного (как вы выразились).
Кстати, я думаю, это не имеет отношения к этому сообщению, но это напоминает мне о полезности Moose
предиката и более четких методов, которые очень полезны для явного различения ложного или неопределенного значения атрибута и атрибута, который не был установлен.
Ответ №2:
Попробуйте:
use Data::Dumper;
print Dumper $region;
Это подскажет вам, что $region
есть на самом деле.
Я подозреваю, что это сработает:
use Scalar::Util;
if( defined( $region ) amp;amp; ref( $region ) amp;amp; blessed( $region )){
Смотрите:
данные perldoc::Dumper
скаляр perldoc::Util и поиск /blessed/
Комментарии:
1. В логическом контексте этого
blessed( $region )
должно быть достаточно — потому что логический контекст не жалуется на undefs.
Ответ №3:
если Functiontofind
возвращает что-то отличное от undef
, когда ничего не найдено, тогда вам нужно будет выяснить, что он возвращает в этом случае, и построить свой тест на основе этого. Если это все еще какой-то объект, но другого типа, ref
может подойти, или, возможно isa
(из UNIVERSAL).
Но ваш модуль может просто возвращать объект того же класса, но с некоторыми пустыми атрибутами. Возможно, вам придется протестировать это… В таком случае я бы предложил добавить метод просто для проверки, является ли объект этого класса пустым.
Ответ №4:
В идеале, я хотел бы Functiontofind
вернуть что-то всегда , а затем использовать метод $region
нравится isEmpty
или что-то решать, будет ли он пустым или нет, а не возвращать ничего, если совпадение найдено. Однако, если вы хотите, вы можете проверить, $region == undef
чтобы увидеть, не определен ли он.
Комментарии:
1. @Noufal Ibrahim: Вы не можете протестировать
$region == undef
, способ проверить, определена переменная или нет, заключается в :defined $region
2. Мой perl очень ржавый. Можете ли вы объяснить, что делает проверка на равенство с
undef
? Кажется, я припоминаю, что использовал его для выполнения чего-то подобного. Вот пример. — pastebin.com/cRXKW4g93. @Noufal Ibrahim: в этом случае он всегда будет возвращать значение true, потому что вы выполняете числовой тест
==
$region будет приведен к 0 и undef тоже.4. В моем примере с pastebin первое значение равно true, а второе — false.
5. Если $region является ссылкой на объект, она оценивается как true (если она не определена) в логическом контексте и как 0 в числовом контексте.