以下のコードを実行すると、「リスト割り当てで初期化されていない値が使用されています」という警告が表示されます。
local %ENV = ();
%ENV = foo(); //foo returns a hash
%ENV のダンプ結果は次のとおりです。
{
'KEY1' => '-',
'KEY2' => '-',
}
しかし、警告は行で出続け%ENV = foo()
ます;
ありがとう!
以下のコードを実行すると、「リスト割り当てで初期化されていない値が使用されています」という警告が表示されます。
local %ENV = ();
%ENV = foo(); //foo returns a hash
%ENV のダンプ結果は次のとおりです。
{
'KEY1' => '-',
'KEY2' => '-',
}
しかし、警告は行で出続け%ENV = foo()
ます;
ありがとう!
編集:
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 のローカライズされたバージョンはもう存在しないためです。
foo()
結果にを返してundef
います。初期化は、返さlocal %ENV = ()
れる初期化されていない値とは関係ありませんfoo()
。
また、技術的な注意:foo
はハッシュを返しません。ハッシュを設定するために割り当てる値のリストを返す場合がありますが、関数はスカラーまたはリストのみを返すことができ、ハッシュは返すことができません。