zsh подстановки: (P) и :: = операторы взаимодействия - PullRequest
0 голосов
/ 04 июня 2018

Может кто-нибудь объяснить мне результат следующего скрипта в zsh:

#!/bin/zsh
var1=var2
var2=first
var3=second
echo var1="$var1"
echo var2="$var2"
echo var3="$var3"
echo '${${(P)var1::=var3}}'="${${(P)var1::=var3}}"
echo var1="$var1"
echo var2="$var2"
echo var3="$var3"
echo ------------
var1=var2
var2=first
var3=second
echo var1="$var1"
echo var2="$var2"
echo var3="$var3"
echo '${(P)var1::=var3}'="${(P)var1::=var3}"
echo var1="$var1"
echo var2="$var2"
echo var3="$var3"

Результат:

var1=var2
var2=first
var3=second
${${(P)var1::=var3}}=second
var1=var2
var2=var3
var3=second
------------
var1=var2
var2=first
var3=second
${(P)var1::=var3}=var3
var1=var2
var2=var3
var3=second

Насколько я понимаю руководство zsh (14.3.2 Правила), выполнение первого раздела (выше ------) должно быть следующим:

  1. Точка 7 (примените оператор :: =) (установите var1 в var3)
  2. Точка 25 (применить оператор (P)) (разыменование var1, получить var3)
  3. Вывести значение var3: 'second'

Эти шаги согласуются со следующимистрока в результате:

${${(P)var1::=var3}}=second

Но почему в результате появляются следующие строки:

var1=var2
var2=var3

вместо ожидаемого:

var1=var3
var2=first

Выполнениевторой раздел (ниже ----) должен быть (согласно руководству):

  1. Точка 4 (применить оператор (P)) (разыменование var1, получить var2)
  2. Точка 7 (примените оператор :: =) (установите для var2 значение var3)
  3. Выведите значение переменной var2: 'var3'

Результаты этого раздела соответствуют описанию abovОтлично, поэтому проблема только в первом разделе.

1 Ответ

0 голосов
/ 04 июня 2018

Вы пропустили правило 1: вложенная замена.Учитывая ${${(P)var1::=var3}}=second, правило 1 сначала (рекурсивно) оценивает ${(P)var1::=var3}, которое начинается с применения правила 4, чтобы превратить его в ${first::=var3}. Затем вы можете применить правило 7 для оценки оператора ::=.Как только это будет сделано, вы вернетесь к оценке внешнего ${...}.

...