Parsing <;语法异常>;意外字符($F[0]=(shift@F)。“$F[0]$,=”:“打印@F&”x27;“]

Parsing <;语法异常>;意外字符($F[0]=(shift@F)。“$F[0]$,=”:“打印@F&”x27;“],parsing,yaml,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.Dat

这是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解析器异常。

首先,让我们以更可读的格式解开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
开头的单引号标量,解析器希望在该值之后有一个逗号或序列的结尾。但是,它发现了一个
$
,这正是它所抱怨的

现在很明显,您不希望在
$
之前停止标量;
'
应该是内容的一部分。有多种方法可以实现这一点,但最具可读性的方法可能是将值定义为块标量:

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中也是错误的)。

我删除了“{out}}/utestt.csv”中的逗号,它工作得非常好。非常感谢