#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 чего-либо, всегда ли это будет хорошей практикой? @chorobadefined
не кажется необходимым, он работает так.
Ответ №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 ...";