Может ли значение быть неинициализированным, но все же определенным в Perl?
Запуск ActiveState Perl 5.10.1 на win32.
Как получается, что этот код:
die(defined($r->unparsed_uri =~ '/(logout.pl)?$'));
... умирает с 1
в то время как изменение той же строки, чтобы сказать это:
die($r->unparsed_uri =~ '/(logout.pl)?$');
... умирает с Use of uninitialized value in die
?
Как это defined
еще uninitialized
? Я думал, что неинициализированный означает неопределенный.
2 ответа
В первом случае операция сопоставления происходит в скалярном контексте. Во втором случае это происходит в контексте массива, почти как если бы вы написали:
my @groups = $r->unparsed_uri =~ '/(logout.pl)?$';
die @groups;
Если $r->unparsed_uri
соответствует шаблону, но $1
не определено, потому что совпадающая строка оканчивается на "/", тогда @groups будет массивом длины 1, содержащим единственный элемент undef
,
Соберите все это вместе, как если бы вы сказали:
die(undef);
У вас есть предупреждения включены?
Дано
#!/usr/bin/perl -l
use strict; use warnings;
my $uri;
die(defined($uri =~ '/(logout.pl)?$'));
я получил
Использование неинициализированного значения $uri в сопоставлении с образцом (m//) в строке E:\t.pl 7. 1 на E:\t.pl строка 7.
который объясняет, что происходит.
$uri
не определено, поэтому вы получите предупреждение за использование этого в m//
, Так как $uri
не определено, результат совпадения ложен, но определен. Следовательно, defined
возвращает истину и die
выходы 1
,