在 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
?
defined
和uninitialized
怎么样?我认为未初始化意味着未定义。
【问题讨论】:
我打赌这只是一些时髦的标量与列表上下文的东西。 【参考方案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 中可以未初始化但仍定义值吗?的主要内容,如果未能解决你的问题,请参考以下文章