Perl6 один лайнер исполнения.Как обновляется тема? - PullRequest
0 голосов
/ 25 января 2019

Выполнение одной строки для обработки CSV строки за раз от stdin:

perl6 -ne 'my @a; $_.split(",").kv.map: {@a[$^k]+=$^v}; say @a; ENTER {say "ENTER"}; BEGIN {say "BEGIN"}; LEAVE {say "LEAVE"}; END {say "END"}';

Ввод:

1,1
1,1
^D

Дает следующий вывод:

BEGIN
ENTER
1,1
[1 1]
1,1
[2 2]
LEAVE
END

Здесь мы видим, что один вкладыш не является блоком, выполняемым несколько раз, поскольку фазер ENTER и LEAVE выполняются только один раз.

Это имеет смысл, так как переменная @a накапливается.Если бы один вкладыш был блоком, значение @a будет сбрасываться каждый раз.

Мой вопрос: как обновляется переменная темы $ _?Переменная theme является Str (по крайней мере, так говорит $ _. ^ Name).Как обновляется его значение без повторного входа в блок?

Чего мне не хватает?

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Когда вы добавляете -n, он добавляет for цикл вокруг вашего кода.

Вы думаете, что он добавляет один такой:

for lines() {
  # Your code here
}

Компилятор просто добавляет абстрактный синтаксисузлы дерева для зацикливания без фактического добавления блока.

(
   # Your code here
) for lines()

(Это может быть истолковано как ошибка.)

Чтобы заставить его работать так же, как первый:

(             # -n adds this

  -> $_ {     # <-- add this

              # Your code here

  }( $_ )     # <-- add this

) for lines() # -n adds this

Я пытался просто добавить пустой блок, но то, как компилятор добавляет цикл, приводит к тому, что он не работает.


В общем случае ENTER и LEAVE ограничены блоком{}, но они также ограничиваются « файлом », если нет блока.

ENTER say 'ENTER file';
LEAVE say 'LEAVE file';
{
  ENTER say '  ENTER block';
  LEAVE say '  LEAVE block';
}
ENTER file
  ENTER block
  LEAVE block
LEAVE file

Поскольку в вашем коде нет блока, всенаходится в области « file ».

0 голосов
/ 25 января 2019

Аргумент командной строки -n создает цикл вокруг вашей программы,

for $*ARGFILES.lines {
    # Program block given on command line
}

в то время как используемые программные фазеры (BEGIN и END) запускаются один раз либо во время компиляции, либо после завершения программного блока, поэтому они будут не быть частью цикла во время выполнения.

Фазер блока ENTER будет работать при каждом входе в блок, тогда как Фазер блока LEAVE будет работать при каждом выходе из блока. Таким образом, эти фазеры будут работать для каждой строки, прочитанной в цикле for.

...