【问题标题】:Use of uninitialized value in list assignment in Perl在 Perl 的列表赋值中使用未初始化的值
【发布时间】:2013-04-09 09:27:21
【问题描述】:

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

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

%ENV 的转储结果为:

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

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

谢谢!

【问题讨论】:

  • 添加foo()的代码
  • @NathanielWaisbrot 感谢您的建议。 foo() 相当复杂,所以我添加了 ENV 的结果。请在问题更新中找到它
  • @Terry 也许你添加了完整的代码并在你的脚本中添加了use strict; use warnings
  • 问题很明显在于您没有发布的代码。由于foo() 很复杂,请将其替换为产生相同输出的虚拟版本。例如sub foo { return ('KEY1'=>'-','KEY2'=>'-'); }。然后发布围绕错误的所有代码,包括您的转储语句。

标签: perl local initialization


【解决方案1】:

编辑:

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

当您认为%ENV 正在与环境混为一谈时,这是有道理的。 gnu.orgsetenv 有这样的说法:“值参数的空指针是非法的”。如果要删除环境变量,请将其从哈希中删除。如果要将其设置为空字符串,请使用空字符串作为值。在这里使用undef(相当于null)没有任何意义。

检查您的foo() 以确保它返回的值都不是undef


旧答案:

您确定foo() 正在返回您尝试在%ENV 中使用的内容吗?

这是一个从foo() 填充%ENV 的示例。

#!/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 的本地化版本不再存在。

【讨论】:

  • 感谢精彩的演示。我的foo() 正在返回我想要的,并且我已经使用 Dump 验证了这一点。但程序仍在抱怨警告。
  • 究竟是哪一行产生了错误?可能值得分享更多代码。
  • %ENV = foo() 行正在产生警告。为了便于阅读,示例中的代码被大大简化了。
  • 更新了我的答案。不确定它是否与您的场景有关,但这是我产生相同错误的唯一方法。
【解决方案2】:

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

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

【讨论】:

  • 感谢您的回答。但我仔细检查了foo 没有返回undef(请在更新的问题中找到)。
  • @Terry : 建议你把%ENV%{foo()}分开转储看看有没有区别。
猜你喜欢
  • 1970-01-01
  • 2011-07-19
  • 1970-01-01
  • 2016-09-25
  • 2015-06-03
  • 1970-01-01
  • 2013-04-08
  • 1970-01-01
  • 2012-06-20
相关资源
最近更新 更多