Может ли значение быть неинициализированным, но все же определенным в Perl? - PullRequest
2 голосов
/ 02 февраля 2010

Запуск 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 ]

8 голосов
/ 03 февраля 2010

В первом случае операция сопоставления выполняется в скалярном контексте. Во втором случае это происходит в контексте массива, почти как если бы вы написали:

my @groups = $r->unparsed_uri =~ '/(logout.pl)?$';
die @groups;

Если $r->unparsed_uri соответствует шаблону, но $1 не определено, поскольку совпадающая строка заканчивается символом "/", тогда @groups будет массивом длины 1, содержащим единственный элемент undef.

Соберите все вместе, как если бы вы сказали:

die(undef);
2 голосов
/ 03 февраля 2010

У вас включены предупреждения?

Дано

#!/usr/bin/perl -l

use strict; use warnings;

my $uri;

die(defined($uri =~ '/(logout.pl)?$'));

Я получаю

Use of uninitialized value $uri in pattern match (m//) at E:\t.pl line 7.
1 at E:\t.pl line 7.

, который объясняет, что происходит.

$uri не определено, поэтому вы получите предупреждение за использование этого в m//. Поскольку $uri не определено, результатом совпадения является ложь, но определено . Следовательно, defined возвращает true и die выводит 1.

...