当我运行下面的代码时,我收到警告“在列表赋值中使用未初始化的值”:
local %ENV = ();
%ENV = foo(); //foo returns a hash
%ENV 的转储结果是:
{
'KEY1' => '-',
'KEY2' => '-',
}
但是警告不断出现%ENV = foo()
;
谢谢!
当我运行下面的代码时,我收到警告“在列表赋值中使用未初始化的值”:
local %ENV = ();
%ENV = foo(); //foo returns a hash
%ENV 的转储结果是:
{
'KEY1' => '-',
'KEY2' => '-',
}
但是警告不断出现%ENV = foo()
;
谢谢!
foo()
undef
在其结果中返回一个。初始化local %ENV = ()
与返回的未初始化值无关foo()
。
此外,技术说明:foo
不返回哈希值。它可能会返回一个值列表,然后分配这些值以填充散列,但函数只能返回标量或列表,而不能返回散列。
编辑:
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 的本地化版本不再存在。