0

当我运行下面的代码时,我收到警告“在列表赋值中使用未初始化的值”:

local %ENV = ();
%ENV = foo(); //foo returns a hash

%ENV 的转储结果是:

{
  'KEY1' => '-',
  'KEY2' => '-',
}

但是警告不断出现%ENV = foo()

谢谢!

4

2 回答 2

4

foo()undef在其结果中返回一个。初始化local %ENV = ()与返回的未初始化值无关foo()

此外,技术说明:foo不返回哈希值。它可能会返回一个值列表,然后分配这些值以填充散列,但函数只能返回标量或列表,而不能返回散列。

于 2013-04-08T04:22:28.267 回答
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 的本地化版本不再存在。

于 2013-04-08T04:28:19.647 回答