在 Perl 中可以未初始化但仍定义值吗?

Posted

技术标签:

【中文标题】在 Perl 中可以未初始化但仍定义值吗?【英文标题】:Can a value be uninitialized, but still defined, in Perl? 【发布时间】:2011-01-12 08:36:02 【问题描述】:

在 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?

defineduninitialized 怎么样?我认为未初始化意味着未定义。

【问题讨论】:

我打赌这只是一些时髦的标量与列表上下文的东西。 【参考方案1】:

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

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

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

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

die(undef);

【讨论】:

哦,我应该提到,如果不是很明显,你可以通过 die(scalar($r->unparsed_uri =~ '/(logout.pl)? $'));【参考方案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// 中使用它时会收到警告。因为$uri没有定义,所以匹配的结果是假的,但是定义了。因此,defined 返回 true,die 输出 1

【讨论】:

我不认为它必须是 undef =~ /(bar)?/ - 我认为 "foo" =~ /(bar)?/ 也可以产生报告的行为。 @fennec 我刚刚描述了为什么 OP 看到了他看到的行为。 defined(...) 中的内容是错误的,但已定义。 $r->unparsed_uri 并没有像问题的标题所暗示的那样未初始化和定义。

以上是关于在 Perl 中可以未初始化但仍定义值吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何以 root 身份运行 Perl 脚本但仍会影响用户 gconf 设置

有啥办法可以拆分数组中的哈希值吗?

使用 stat 在 Perl 中获取未初始化的变量

JAXB 可以在基类中初始化值吗?

可以(重新)在一行中(在初始化之后)设置数组的所有值吗?

Perl - 使用未初始化的值?