【问题标题】:<ParseException> Unexpected characters ($F[0] = (shift @F) .".$F[0]"; $, = ":"; print @F;'']<ParseException> 意外字符 ($F[0] = (shift @F) .".$F[0]"; $, = ":"; print @F;'']
【发布时间】:2020-02-08 10:50:46
【问题描述】:

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

【问题讨论】:

    标签: parsing yaml


    【解决方案1】:

    首先,让我们以更易读的格式解开 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]
    

    &gt;- 启动一个流标量,可以跨越多行,换行符会被折叠成一个空格字符。请注意,我删除了周围的流映射 ({…}) 并将其替换为块映射,以便能够在其中使用块标量。

    我还将answer 更改为当前不是的序列,但它看起来应该是(在您显示的 YAML 中也是错误的)。

    【讨论】:

    • 我删除了 '{{out}}/utestt.csv' 中的逗号,效果很好。非常感谢
    猜你喜欢
    • 1970-01-01
    • 2015-04-14
    • 2015-08-10
    • 2022-11-05
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多