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

Perl中列表赋值中未初始化值的使用,perl,local,initialization,Perl,Local,Initialization,当我运行下面的代码时,我得到警告“在列表分配中使用未初始化值”: %ENV的转储结果是: { 'KEY1' => '-', 'KEY2' => '-', } 但是警告一直出现在第%ENV=foo()行 谢谢 foo()在其结果中返回一个undef。初始化local%ENV=()与foo()返回的未初始化值无关 另外,技术说明:foo没有返回散列。它可能返回一个值列表,然后分配给填充哈希,但函数只能返回标量或列表,而不能返回哈希。编辑: 在尝试将undef值分配给%ENV时,

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

%ENV的转储结果是:

{
  'KEY1' => '-',
  'KEY2' => '-',
}
但是警告一直出现在第
%ENV=foo()行

谢谢

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

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

编辑:

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

<>这是有意义的,当你认为代码> %Env与环境混在一起。对于
setenv
:“值参数的空指针是非法的”。如果要删除环境变量,请将其从哈希中删除。如果要将其设置为空字符串,请使用和空字符串作为值。使用
unde
(相当于
null
)在这里没有任何意义

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


旧答案:

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

下面是一个从
foo()
填充
%ENV
的示例

输出预期的结果:

$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()
@NathanielWaisbrot添加代码谢谢您的建议。foo()非常复杂,因此我添加了ENV的结果。请在问题中找到它update@Terry也许你添加了完整的代码,也添加了
use strict;在脚本中使用警告
?问题很明显在于您没有发布的代码。由于
foo()
非常复杂,请将其替换为生成相同输出的虚拟版本。例如
子foo{return('KEY1'=>'-','KEY2'=>'-');}
。然后发布有关错误的所有代码,包括dump语句。感谢您的精彩演示。我的
foo()
正在返回我想要的内容,我已经使用Dump验证了这一点。但是程序仍然在抱怨警告。到底是哪一行产生了错误?可能值得分享更多的代码。行
%ENV=foo()
产生警告。为了便于阅读,示例中的代码大大简化。更新了我的答案。不确定是否与您的场景相关,但这是我生成相同错误的唯一方法。谢谢您的回答。但是我已经仔细检查了
foo
没有返回
undef
(请在更新的问题中查找)。@Terry:我建议您分别转储
%ENV
%{foo()}
,看看是否有任何差异。
#!/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.