<ParseException> Неожиданные символы ($ F [0] = (shift @F). ". $ F [0]"; $, = ":"; print @F; ''] - PullRequest
0 голосов
/ 11 октября 2019

Это файл yaml:

tasks:
    test: {include: [bash_exec], args:['-c', 'state --m=4 in=in4.db | cppextract -f , -P NEW_MODEL /stdin Id Date {a,b,b2}{c,d}L {d1,d2,d3,d4}{x,}y | perl -lane '$F[0] = (shift @F) .".$F[0]"; $, = ":"; print @F;' | state2 --id=Id.Date wq.db -'], answer: '{{out}}/utestt.csv', n: 5, cols: [f,k]} 

При анализе он выдает следующую ошибку:

Неожиданные символы ($ F [0] = (shift @F). ". $ F [0]"; $, = ":"; print @F; '']

Эта команда

state --m=4 in=in4.db | cppextract -f , -P NEW_MODEL /stdin Id Date {a,b,b2}{c,d}L {d1,d2,d3,d4}{x,}y | perl -lane '$F[0] = (shift @F) .".$F[0]"; $, = ":"; print @F;'

обеспечивает правильный вывод команды linuxстрока, но выдает исключение парсера yaml при запуске через yaml.

1 Ответ

0 голосов
/ 11 октября 2019

Сначала давайте распутаем файл YAML в более удобочитаемом формате:

tasks:
  test: {
    include: [bash_exec],
    args:['-c', 'state --m=4 in=in4.db | cppextract -f , -P NEW_MODEL /stdin Id Date {a,b,b2}{c,d}L {d1,d2,d3,d4}{x,}y | perl -lane '$F[0] = (shift @F) .".$F[0]"; $, = ":"; print @F;' | state2 --id=Id.Date wq.db -'],
    answer: '{{out}}/utestt.csv', n: 5, cols: [f,k]
  }

Первая проблема - args:[;YAML требует, чтобы вы отделили значение сопоставления от ключа (если ключ не является скаляром в кавычках). Давайте сделаем это:

tasks:
  test: {
    include: [bash_exec],
    args: [
      '-c',
      'state --m=4 in=in4.db | cppextract -f , -P NEW_MODEL /stdin Id Date {a,b,b2}{c,d}L {d1,d2,d3,d4}{x,}y | perl -lane '
      $F[0] = (shift @F) .".$F[0]"; $, = ":"; print @F;' | state2 --id=Id.Date wq.db -'
    ],
    answer: '{{out}}/utestt.csv', n: 5, cols: [f,k]
  }

Это делает очевидным, что происходит: вы заканчиваете скаляр в одинарных кавычках, начинающийся с 'state прямо перед символом $. Поскольку мы находимся в последовательности потока YAML (начинается с [), синтаксический анализатор ожидает запятую или конец последовательности после этого значения. Тем не менее, он находит $, на что жалуется.

Теперь, очевидно, вы не хотите останавливать скаляр до $;' должен быть частью содержимого. Есть несколько способов достижения этого, но наиболее читаемый способ, вероятно, состоит в том, чтобы определить значение как скаляр блока:

tasks:
  test:
    include: [bash_exec]
    args:
    - '-c'
    - >-
      state --m=4 in=in4.db | cppextract -f ,
      -P NEW_MODEL /stdin Id Date {a,b,b2}{c,d}L {d1,d2,d3,d4}{x,}y |
      perl -lane '$F[0] = (shift @F) .".$F[0]"; $, = ":"; print @F;' |
      state2 --id=Id.Date wq.db -
    answer:
    - '{{out}}/utestt.csv',
    - n: 5
    - cols: [f, k]

>- запускает скаляр потока, который может занимать несколько строк, и разрывы строкбудет свернут в космический характер. Обратите внимание, что я удалил отображение окружающего потока ({…}) и заменил его на отображение блоков, чтобы иметь возможность использовать в нем скаляр блока.

Я также изменил answer на последовательность, которой он являетсяв настоящее время нет, но похоже, что так и должно быть (это также ошибочно в YAML, который вы показываете).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...