zshexpnのマニュアルページ(zshバージョン5.1.1)には、次のものがあります。
パラメータ拡張フラグ
(P):パラメータ名の値が、その値が使用される追加のパラメータ名として解釈されるように強制します。typesetコマンド群の1つ(特に変換)を使用して設定されたフラグは、この方法で使用される名前の値には適用されません。
したがって、通常の配列パラメータがある場合は、次のようにできます。
typeset -a array
array=(x y)
ptr=array
echo ${${(P)ptr}[1]}
これは、組版フラグでパラメータを配列として表示する必要がないx
ためだと思います。-a
しかし、連想配列で同じことを行うと、次のようになります。
typeset -A assoc
assoc=(foo x bar y)
ptr=assoc
echo ${${(P)ptr}[foo]}
画面に何も印刷されません。これは上記のマニュアルページのメッセージと一致しているようです。なぜなら、以下を実行すると:
echo ${(P)ptr}
# returns: x y
echo ${${(P)ptr}[1]}
# returns: x
echo ${${(P)ptr}[2]}
# returns: y
-A
フラグがtypeset
削除され、通常の配列があるかのように動作します。
しかし、次のコマンドを実行すると:
echo ${(Pk)ptr}
# returns: foo bar
echo ${(Pv)ptr}
# returns: x y
echo ${(Pkv)ptr}
# returns: foo x bar y
ある意味では、連想配列の状態が常に失われるわけではないようです。だから私はtypeset
彼らがいつもそうではないように見えますが、なぜロゴを落とすように設計されたのかは本当に理解していません。
主に私の質問は次のとおりです。これを行う方法はありますか?
echo ${${(P)ptr}[foo]}
フラグが削除されていないかのようにx
(キーに関連付けられた値)を返し、他の関連配列のように処理できます。私の考えではfoo
typeset -A
いいえ■有効に切り替えるeval
:利用可能なzshパラメータトリックはありますか?