Может ли значение быть неинициализированным, но все же определенным в 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,

Другие вопросы по тегам