Kev
Kev

Reputation: 16321

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->unparsed_uri =~ '/(logout.pl)?$');

...dies with Use of uninitialized value in die?

How is it defined yet uninitialized? I thought uninitialized meant undefined.

Upvotes: 2

Views: 613

Answers (2)

Sinan Ünür
Sinan Ünür

Reputation: 118138

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.

Upvotes: 2

Sean
Sean

Reputation: 29772

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);

Upvotes: 8

Related Questions