gpt4 book ai didi

perl - 为什么 undef 变量在没有定义的情况下变成 {}?

转载 作者:行者123 更新时间:2023-12-01 06:44:05 25 4
gpt4 key购买 nike

我正在审查 webmin 的 source code .

($wuser) = grep { $_->{'name'} eq $in{'user'} } &acl::list_users();

如果我们像 ?user=notexist 一样传递 $in{'user'},变量 $wuser 将是 undef,不是吗?

抽象代码描述了下面发生的事情。

# $wuser is undef now.
#die Dumper($wuser);
if($wuser){die 'not die here';}
if ($wuser->{'pass'} eq 'x') {
#never reach here.
die 'not die in branch 1';
}
elsif ($wuser->{'pass'} eq '*LK*' ||
$wuser->{'pass'} =~ /^\!/) {
#never reach here too.
die 'not die in branch 2';
}
if($wuser){die 'so....why die here '.Dumper($wuser);}
# $wuser is {} now.
}

所以... undef 变量何时以及如何在没有任何定义的情况下变为 {}...

最佳答案

这里的问题是一个称为“自动生存”的 Perl 功能。基本上,这意味着如果您将未定义的 Perl 变量视为一种引用类型,那么 Perl 将创建该类型的引用并将其存储在您的变量中。

所以当你执行这个语句时你的问题就开始了:

if ($wuser->{'pass'} eq 'x')

Perl 认为您将 $wuser 视为哈希引用,因此它创建一个空哈希并将对该哈希的引用存储在 $wuser 中。然后它可以在该哈希中查找“pass”键并发现它不存在。

通常,这被视为一项功能。您可以运行如下代码:

my $hash; # created as undef
$hash->{foo}{bar}{baz} = 1;

Perl 会为你创建这个数据结构:

{
'foo' => {
'bar' => {
'baz' => 1
}
}
};

您无需费心创建哈希的所有中间级别。

当然,您的代码是相当人为的。当您开始查找 key 时,您就知道 $wuser 为 false。所有的引用都是真的,所以一个假的引用永远不能包含键。

关于perl - 为什么 undef 变量在没有定义的情况下变成 {}?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57788390/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com