문제

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->unparsed_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.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top