在Perl中的列表赋值中使用未初始化的值

时间:2013-04-08 04:18:26

标签: perl local initialization

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

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

%ENV的转储结果是:

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

但警告不断出现在第%ENV = foo()行;

谢谢!

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:4)

编辑:

尝试将undef 分配给%ENV时,似乎有特殊行为。如果我$ENV{foo} = undef;,我会收到您所看到的警告。

当您认为%ENV与环境混淆时,这是有道理的。 gnu.orgsetenv有这样的说法:“值参数的空指针是非法的”。如果要删除环境变量,请从哈希中删除它。如果要将其设置为空字符串,请使用和清空字符串作为值。使用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的本地化版本不再存在。