<ParseException>意外字符($ F [0] =(shift @F)。“。$ F [0]”; $,=“:”;打印@F;'']

时间:2019-10-10 23:18:05

标签: parsing yaml

这是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]”; $,=“:”;打印@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 :(得分:0)

首先,让我们以更易读的格式解开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中也是错误的)。