0

以下のコードを実行すると、「リスト割り当てで初期化されていない値が使用されています」という警告が表示されます。

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

%ENV のダンプ結果は次のとおりです。

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

しかし、警告は行で出続け%ENV = foo()ます;

ありがとう!

4

2 に答える 2

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 のローカライズされたバージョンはもう存在しないためです。

于 2013-04-08T04:28:19.647 に答える
4

foo()結果にを返してundefいます。初期化は、返さlocal %ENV = ()れる初期化されていない値とは関係ありませんfoo()

また、技術的な注意:fooはハッシュを返しません。ハッシュを設定するために割り当てる値のリストを返す場合がありますが、関数はスカラーまたはリストのみを返すことができ、ハッシュは返すことができません。

于 2013-04-08T04:22:28.267 に答える