Perl:为什么不能分开?

时间:2019-02-12 09:30:08

标签: perl divide

为什么鸿沟不起作用?

;

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

3 个答案:

答案 0 :(得分:4)

用于替换s ///的默认定界符不平衡,因此会出现错误。这是因为您将$ 1除以4,并引入了另一个'/'。因此,为了安全起见,请使用其他会干扰表达式的字符以外的其他字符。在这种情况下,最好使用<>作为delimtier

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

当用其他定界符转换s ///时,必须将<...>,(...),[...]和{...}配对。我选择了<>,因为表达式中没有它。

答案 1 :(得分:2)

这不起作用:

$ 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

在替换中使用/字符作为分隔符时,表达式中所有出现的/将被视为分隔符。如果您希望将某人看作其他东西(例如,除法运算符),则需要对其进行转义(将\放在其前面)。

另一个选择是选择其他分隔符来代替。在第三个示例中,我改用|。在这种情况下,/不再被视为特殊字符,不需要转义。

答案 2 :(得分:0)

或者使用其他定界符进行替换,否则您将需要使用反斜杠转义分隔符:

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