Как проверить, был ли создан объект в Perl?

#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/cRXKW4g9

3. @Noufal Ibrahim: в этом случае он всегда будет возвращать значение true, потому что вы выполняете числовой тест == $region будет приведен к 0 и undef тоже.

4. В моем примере с pastebin первое значение равно true, а второе — false.

5. Если $region является ссылкой на объект, она оценивается как true (если она не определена) в логическом контексте и как 0 в числовом контексте.