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