代码之家  ›  专栏  ›  技术社区  ›  Fisher

珀尔:为什么不能分开?

  •  0
  • Fisher  · 技术社区  · 6 年前

    为什么分水岭不起作用?

    echo 'cb0' | perl -p -e 's/(\w{3})/sprintf("%d", ( hex($1)/4 ))/e'
    
    Number found where operator expected at -e line 1, near
    "s/(\w{3})/sprintf("%d", ( hex($1)/4" syntax error at -e line 1, near
    "s/(\w{3})/sprintf("%d", ( hex($1)/4" Execution of -e aborted due to
    compilation errors.
    

    原始输入数据是12位十六进制数。

    3 回复  |  直到 6 年前
        1
  •  3
  •   stack0114106    6 年前

    替换的默认分隔符s///不平衡,因此会出现错误。这是因为您将$1除以4,它引入了另一个“/”。为了安全起见,请使用其他一些字符,而不是会弄乱表达式的字符。在这种情况下,最好使用<gt;作为Delimtier

    $ echo 'cb0' | perl -p -e 's<(\w{3})><sprintf("%d", ( hex($1)/4 ))>e '
    812
    

    当您将s///与其他分隔符转换时,必须对<…>、(…)、[…]和…。我选择了<gt;因为它不在表达式中。

        2
  •  2
  •   Dave Cross    6 年前

    这不起作用:

    $ echo 'cb0' | perl -p -e 's/(\w{3})/sprintf("%d", ( hex($1)/4 ))/e'
    Unknown regexp modifier "/4" at -e line 1, at end of line
    syntax error at -e line 1, near "s/(\w{3})/sprintf("%d", ( hex($1)/4 )"
    Execution of -e aborted due to compilation errors.
    

    这样做:

    $ echo 'cb0' | perl -p -e 's/(\w{3})/sprintf("%d", ( hex($1)\/4 ))/e'
    812
    

    这样做,可能更容易理解:

    $ echo 'cb0' | perl -p -e 's|(\w{3})|sprintf("%d", ( hex($1)/4 ))|e'
    812
    

    当你使用 / 字符作为替换中的分隔符,然后所有出现的 / 在表达式中,将被视为分隔符。如果你想让一个被看作是别的东西(例如一个除法运算符),你需要通过 \ 在它前面)。

    另一种选择是为替换选择不同的分隔符。在我的第三个示例中,我已经切换到使用 | 相反。在这种情况下, / 不再被视为特殊的,不需要逃跑。

        3
  •  0
  •   drclaw    6 年前

    要么使用不同的分隔符进行替换,要么需要用反斜杠转义除法:

    echo 'cb0' | perl -p -e 's/(\w{3})/sprintf("%d", ( hex($1)\/4 ))/e'