Can a value be uninitialized, but still defined, in Perl?
Running ActiveState Perl 5.10.1 on win32.
How is it that this code:
die(defined($r->unparsed_uri =~ '/(logout.pl)?$'));
...dies with 1
, whereas changing the same line to say this:
die($r->u开发者_运维百科nparsed_uri =~ '/(logout.pl)?$');
...dies with Use of uninitialized value in die
?
How is it defined
yet uninitialized
? I thought uninitialized meant undefined.
In the first case, the matching operation is taking place in scalar context. In the second case, it's taking place in array context, almost as if you had written:
my @groups = $r->unparsed_uri =~ '/(logout.pl)?$';
die @groups;
If $r->unparsed_uri
matches the pattern, but $1
is undefined because the matched string ended with "/", then @groups will be an array of length 1, containing the single element undef
.
Put it all together, it's as if you'd said:
die(undef);
Do you have warnings enabled?
Given
#!/usr/bin/perl -l
use strict; use warnings;
my $uri;
die(defined($uri =~ '/(logout.pl)?$'));
I get
Use of uninitialized value $uri in pattern match (m//) at E:\t.pl line 7. 1 at E:\t.pl line 7.
which explains what is going on.
$uri
is not defined, so you get a warning for using that in m//
. Because $uri
is not defined, the result of the match is false but defined. Hence, defined
returns true and die
outputs 1
.
精彩评论