Puede desinicializar un valor, pero aún así se define, en Perl?
Pregunta
Ejecución de ActiveState Perl 5.10.1 en win32.
¿Cómo es que este código:
die(defined($r->unparsed_uri =~ '/(logout.pl)?$'));
... troqueles y moldes con 1
, mientras que el cambio de la misma línea de decir esto:
die($r->unparsed_uri =~ '/(logout.pl)?$');
... troqueles y moldes con Use of uninitialized value in die
?
¿Cómo es que todavía defined
uninitialized
? Pensé que no inicializado significaba indefinido.
Solución
En el primer caso, la operación de adaptación está teniendo lugar en contexto escalar. En el segundo caso, se está llevando a cabo en el contexto gama, casi como si hubiera escrito:
my @groups = $r->unparsed_uri =~ '/(logout.pl)?$';
die @groups;
Si $r->unparsed_uri
coincide con el patrón, pero $1
está definido porque la cadena coincidente terminó con "/", entonces @groups será una matriz de longitud 1, que contiene el único undef
elemento.
poner todo junto, es como si hubieras dicho:
die(undef);
Otros consejos
¿Tiene activadas las advertencias?
Dado
#!/usr/bin/perl -l
use strict; use warnings;
my $uri;
die(defined($uri =~ '/(logout.pl)?$'));
consigo
Use of uninitialized value $uri in pattern match (m//) at E:\t.pl line 7. 1 at E:\t.pl line 7.
que explica lo que está pasando.
$uri
no está definido, por lo que obtener una advertencia para el uso que en m//
. Debido $uri
no está definido, el resultado del partido es falsa, pero definido . Por lo tanto, los rendimientos defined
verdadera y die
1
salidas.