perl умирает, если для переменной установлено значение undef, правильно?

#perl

#perl

Вопрос:

Многие библиотеки Perl возвращают undef, если что-то внутреннее не удалось.
Например, с DBI :

 my $result = $sth->fetchrow_hashref();
 

Чтобы просто остановить мою программу в одной строке (в верхнем вызывающем есть eval), поскольку этот уникальный результат всегда актуален для меня, чтобы увидеть, все ли в порядке, и легче, чем try / catch, могу ли я всегда писать:

 my $result = $theLibraryCall or die "ERROR ..." 
 

Это также работает для значения 0.

Комментарии:

1. Вы всегда должны читать документацию для используемой библиотеки. Этот шаблон действительно часто используется, но всегда ? Нет.

2. Я согласен….

3. defined( my $result = theLibraryCall(...) ) or die "ERROR ..."

4. Также имейте в виду, что DBI любит возвращать количество затронутых строк, которое есть 0 , но на самом деле это 0E0 или ноль, но true , поэтому они могут различать ноль и undef . См metacpan.org/pod/DBI#execute и комментарий @choroba выше.

5. да, @simbabque, но мой вопрос более общий, я имею в виду, если я добавлю «или умереть …» в хорошо выбранном операторе my $result = something , при тщательном изучении возвращаемого кода / значения / типа / определения-undef чего-либо, всегда ли это будет хорошей практикой? @choroba defined не кажется необходимым, он работает так.

Ответ №1:

 # Dies if f() returns any false value (incl, but not limited to, undefined)
my $result = f()
   or die ...;

# Dies if f() returns an undefined value
defined( my $result = f() )
   or die ...;

# Dies if f() returns nothing at all
my ($result) = f()
   or die ...;
 

Как вы можете видеть, my $result = f() or die ...; умрет не только для неопределенных значений, но и для всех значений false .

Чтобы умереть только при возврате неопределенного значения, используйте одно из следующих:

 defined( my $result = f() )
   or die ...;
 
 my $result = f()
   // die ...;
 

Обратите внимание, что они немного отличаются. Первый выполняет назначение перед проверкой, в то время как другой выполняет проверку перед назначением.

Ответ №2:

Определенный оператор-или //

Более новая версия perl поддерживает Определенный-или operator — // .

 my $result = theLibraryCall() // die "ERROR ...";
 

В более старой версии perl вы можете использовать

 defined(  my $result = theLibraryCall() ) || die "ERROR ...";