当我运行下面的代码时,我收到警告“在列表分配中使用未初始化的值”:
local %ENV = ();
%ENV = foo(); //foo returns a hash
%ENV的转储结果是:
{
'KEY1' => '-',
'KEY2' => '-',
}
但警告不断出现在第%ENV = foo()
行;
谢谢!
答案 0 :(得分:4)
foo()
在其结果中返回undef
。初始化local %ENV = ()
与foo()
正在返回的未初始化值无关。
此外,技术说明:foo
未返回哈希值。它可能会返回一个值列表,然后您指定这些值来填充哈希值,但函数只能返回标量或列表,而不能返回哈希值。
答案 1 :(得分:4)
编辑:
尝试将undef
值分配给%ENV
时,似乎有特殊行为。如果我$ENV{foo} = undef;
,我会收到您所看到的警告。
当您认为%ENV
与环境混淆时,这是有道理的。 gnu.org对setenv
有这样的说法:“值参数的空指针是非法的”。如果要删除环境变量,请从哈希中删除它。如果要将其设置为空字符串,请使用和清空字符串作为值。使用undef
(相当于null
)在这里没有任何意义。
检查您的foo()
,确保其返回的值均不是undef
。
旧答案:
您确定foo()
正在返回您在%ENV
中尝试使用的内容吗?
以下是从%ENV
填充foo()
的示例。
#!/usr/bin/perl -w
use strict;
use warnings;
use Data::Dumper;
local %ENV = (); # redundant use of 'local' in example
%ENV = foo();
print Dumper(\%ENV);
sub foo {
my %hash = ( "foo" => "bar" );
return %hash;
}
预期输出的内容:
$VAR1 = {
'foo' => 'bar'
};
使用调试器来测试foo()
返回的内容以及%ENV
中包含的内容可能是值得的。
另外,请仔细检查以确保在尝试使用本地化版本的%ENV
时仍然在范围内。例如:
#!/usr/bin/perl -w
use strict;
use warnings;
{
local %ENV = ( "foo" => "bar" );
print $ENV{foo}, "\n"; # expect "bar"
}
print $ENV{foo}, "\n"; # expect warning
结果:
bar
Use of uninitialized value in print at ./test2.pl line 10.
因为%ENV的本地化版本不再存在。