我在Perl中有以下(从错误中理想化)短脚本:
my %metadata = undef;
if (defined %metadata)
{
print "defined";
}
Run Code Online (Sandbox Code Playgroud)
由于某种原因,程序的输出总是"定义".因此,将哈希值设置为"未定义"会使其定义.它被定义为"未定义"吗?
编辑:
这是一个理想化的案例,试图复制问题.我实际上做的更像是:
my %metadata = my_sub_function();
if (defined %metadata)
{
print "defined";
}
Run Code Online (Sandbox Code Playgroud)
my_sub_function的输出可能是undef,()或填充的哈希,我只想在最后一种情况下打印"已定义".
编辑2:
顺便说一句,我发现了
if (scalar(keys %metadata)
Run Code Online (Sandbox Code Playgroud)
行为正确的(),但仍然不适用于undef.
尝试
my %metadata;
undef %metadata;
if (defined %metadata)
{
print "defined";
}
Run Code Online (Sandbox Code Playgroud)
我认为它只是使用"undef"作为填充哈希的数据.
"使用警告"会说:
defined(%hash) is deprecated at t.pl line 6.
(Maybe you should just omit the defined()?)
Odd number of elements in hash assignment at t.pl line 4.
Use of uninitialized value in list assignment at t.pl line 4.
Run Code Online (Sandbox Code Playgroud)
undef,()或填充的哈希
如果你真的想要区分空哈希和没有哈希,那么最好使用哈希引用(也可以更轻松地从子例程传递,没有副本和所有).
如果你的函数返回undef并且undef被置于散列中,则自动字符串化会将undef更改为''最终的结果:%metadata = ( '' => undef ).
如果你的函数需要返回undef,()或者正确的哈希,你需要分别测试所有三种情况,我建议:
my %metadata = my_sub_function();
if ( !scalar keys %metadata ) {
print "An empty list () was returned\n"
} elsif (
scalar keys %metadata == 1 and
exists $metadata{''} and
!defined $metadata{''}
) {
print "undef or '' was returned\n";
} else {
print "A hash was hopefully returned\n";
}
Run Code Online (Sandbox Code Playgroud)
您可以使用以下my_sub_functions对其进行测试:
sub my_sub_function { return () } # 1st case
sub my_sub_function { return undef } # 2nd case
sub my_sub_function { return ( a => 1, b => 2 ) } # 3rd case
sub my_sub_function { return qw/not a hash/ } # unhandled case
Run Code Online (Sandbox Code Playgroud)
快乐的黑客