zshexpn 매뉴얼 페이지(zsh 버전 5.1.1)에는 다음이 있습니다.
매개변수 확장 플래그
(P): 매개변수 이름의 값이 해당 값이 사용될 추가 매개변수 이름으로 해석되도록 강제합니다.typeset 명령군 중 하나(특히 변환)를 사용하여 설정된 플래그는 이러한 방식으로 사용되는 이름 값에 적용되지 않습니다.
따라서 일반 배열 매개변수가 있는 경우 다음과 같이 할 수 있습니다.
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
( key 와 연관된 값 )을 반환 하고 다른 연관 배열처럼 처리할 수 있습니다. 제 생각에는foo
typeset -A
아니요s 사용으로 전환 eval
: 사용할 수 있는 zsh 매개변수 트릭이 있나요?