3

この例では、ある連想配列から別の連想配列にすべての値をコピーしようとしています。を使用して構文エラーに対してコードをチェックしていますzsh -nが、これはをスローしtest:12: bar: assignment to invalid subscript rangeます。

#!/usr/bin/env zsh
typeset -A foo bar
foo=(
    Adama   "Commander"
    Tigh    "Executive Officer"
    Roslin  "President"
)
bar=()

for i in ${(k)foo}; do
    # "rubbish"
    bar[$i]=$foo[$i]
done

# "rubbish行のコメントを外すと、zsh -n文句を言うのをやめます。私のコードまたは何か問題がありますzsh -nか?

4

1 に答える 1

5

デバッグモードを追加することで、何が起こっているかを確認できます(-x

non_execモード(-n)は何も実行しないため、実行されないためtypesetbar「連想配列」ではなく、割り当ては無効です。

「ごみ」行(またはコマンドのように見える他の行)が存在すると、プログラムが「for」ループに入るのを防ぐことがわかります。

Zshメーリングリスト:zsh -nは連想配列インデックスをgrokしませんか?(2011年1月)

zsh 4.3.12で試してみましたが、動作はより一貫しており-n、プログラムは「for」ループに入ることがありません。

ループのない小さなプログラムの場合:

#!/usr/bin/env zsh
typeset -A bar
bar[test]=testons
echo $bar

zsh 4.3.10と4.3.12はどちらも同じ方法でプログラムを実行し ますが、そうでないzsh-4.3.10 -n場合はエラー(無効な添え字範囲への割り当て)を誤って報告します zsh-4.3.12 -n

結論として、zsh 4.3.12を使用します(または、より新しい、ZSH 5が利用可能であることを発見しました)
zshに関するニュース(1997年の「ニュース」を含む!)

于 2012-11-16T13:24:55.490 に答える