1

Perlと間接参照に奇妙な問題があります。

2つの異なるセクションの下に配列値を含むINIファイルがあります。

[Common]
animals =<<EOT
dog
cat
EOT

[ACME]
animals =<<EOT
cayote
bird
EOT

INIファイルを%INIハッシュに読み込み、複数行のエントリを処理するためのサブルーチンがあります。

次に、$org変数を使用して、共通配列と特定の組織配列のどちらを使用するかを決定します。

@array = @{$INI{$org}->{animals}} || @{$INI{Common}->{animals}};

「Common」配列は正常に機能します。つまり$org、「ACME」以外の場合は値(dog cat)を取得しますが、「ACME」と$org等しい場合は2の値を取得しますか?

何か案は??

4

1 に答える 1

6

もちろん、配列の参照解除はスカラーコンテキストを強制するものではありません。しかし、使用||はです。したがって$val = $special_val || "the default";、例ではうまくいかないのに、うまくいくようなものがあります。

したがって@array、単一の数値(最初の配列の要素の数)、またはそれが0の場合は、2番目の配列の要素のいずれかが含まれます。

perlopperldocページには、この例が具体的にリストされています。

In particular, this means that you shouldn't use this for selecting
between two aggregates for assignment:

    @a = @b || @c;              # this is wrong
    @a = scalar(@b) || @c;      # really meant this
    @a = @b ? @b : @c;          # this works fine, though

必要なものに応じて、解決策は次のようになります。

my @array = @{$INI{$org}->{animals}}
   ? @{$INI{$org}->{animals}}
   : @{$INI{Common}->{animals}};
于 2012-08-24T11:31:06.230 に答える