2

在 win32 上运行 ActiveState Perl 5.10.1。

这段代码是怎么回事:

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

...死了1,而改变同一行来这样说:

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

......死了Use of uninitialized value in die

defined还好吗uninitialized?我认为未初始化意味着未定义。

4

2 回答 2

8

在第一种情况下,匹配操作发生在标量上下文中。在第二种情况下,它发生在数组上下文中,几乎就像你写过:

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

如果$r->unparsed_uri匹配模式,但$1由于匹配的字符串以“/”结尾而未定义,则@groups 将是一个长度为 1 的数组,包含单个元素undef

把它们放在一起,就好像你说过:

die(undef);
于 2010-02-02T21:13:41.560 回答
2

您是否启用了警告?

给定

#!/usr/bin/perl -l

use strict; use warnings;

my $uri;

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

我明白了

在 E:\t.pl 第 7 行的模式匹配 (m//) 中使用未初始化的值 $uri。
1 在 E:\t.pl 第 7 行。

这解释了发生了什么。

$uri未定义,因此您会收到在m//. 因为$uriis not defined ,所以匹配的结果是 false 但defined。因此,defined返回 true 并die输出1

于 2010-02-02T21:20:45.557 回答