Perl:为什么不能除法?
Perl: Why can't divide?
为什么除法不起作用?
echo 'cb0' | perl -p -e 's/(\w{3})/sprintf("%d", ( hex()/4 ))/e'
Number found where operator expected at -e line 1, near
"s/(\w{3})/sprintf("%d", ( hex()/4" syntax error at -e line 1, near
"s/(\w{3})/sprintf("%d", ( hex()/4" Execution of -e aborted due to
compilation errors.
原始输入数据是 12 位十六进制数。
替换 s/// 的默认定界符不平衡,因此出现错误。这是因为您将 $1 除以 4 并引入了另一个 '/' 。因此,为了安全起见,请使用除会扰乱表达式的字符之外的其他字符。在这种情况下,最好使用 <> 作为 delimtier
$ echo 'cb0' | perl -p -e 's<(\w{3})><sprintf("%d", ( hex()/4 ))>e '
812
当您将 s/// 与其他定界符转换时,您必须将 <...>、(...)、[...] 和 {...} 配对。我选择 <> 因为它不在表达式中。
要么使用不同的分隔符进行替换,要么您需要使用反斜杠转义分隔线:
echo 'cb0' | perl -p -e 's/(\w{3})/sprintf("%d", ( hex()\/4 ))/e'
这行不通:
$ echo 'cb0' | perl -p -e 's/(\w{3})/sprintf("%d", ( hex()/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()/4 )"
Execution of -e aborted due to compilation errors.
这样做:
$ echo 'cb0' | perl -p -e 's/(\w{3})/sprintf("%d", ( hex()\/4 ))/e'
812
这个也是,而且可能更容易理解:
$ echo 'cb0' | perl -p -e 's|(\w{3})|sprintf("%d", ( hex()/4 ))|e'
812
当您在替换中使用 /
字符作为分隔符时,表达式中出现的所有 /
都将被视为分隔符。如果你想让一个被视为其他东西(例如除法运算符),你需要将它转义(通过在它前面放置 \
)。
另一种选择是为您的替换选择不同的分隔符。在我的第三个示例中,我改为使用 |
。在这种情况下,/
不再被视为特殊的并且不需要转义。
为什么除法不起作用?
echo 'cb0' | perl -p -e 's/(\w{3})/sprintf("%d", ( hex()/4 ))/e'
Number found where operator expected at -e line 1, near
"s/(\w{3})/sprintf("%d", ( hex()/4" syntax error at -e line 1, near
"s/(\w{3})/sprintf("%d", ( hex()/4" Execution of -e aborted due to
compilation errors.
原始输入数据是 12 位十六进制数。
替换 s/// 的默认定界符不平衡,因此出现错误。这是因为您将 $1 除以 4 并引入了另一个 '/' 。因此,为了安全起见,请使用除会扰乱表达式的字符之外的其他字符。在这种情况下,最好使用 <> 作为 delimtier
$ echo 'cb0' | perl -p -e 's<(\w{3})><sprintf("%d", ( hex()/4 ))>e '
812
当您将 s/// 与其他定界符转换时,您必须将 <...>、(...)、[...] 和 {...} 配对。我选择 <> 因为它不在表达式中。
要么使用不同的分隔符进行替换,要么您需要使用反斜杠转义分隔线:
echo 'cb0' | perl -p -e 's/(\w{3})/sprintf("%d", ( hex()\/4 ))/e'
这行不通:
$ echo 'cb0' | perl -p -e 's/(\w{3})/sprintf("%d", ( hex()/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()/4 )"
Execution of -e aborted due to compilation errors.
这样做:
$ echo 'cb0' | perl -p -e 's/(\w{3})/sprintf("%d", ( hex()\/4 ))/e'
812
这个也是,而且可能更容易理解:
$ echo 'cb0' | perl -p -e 's|(\w{3})|sprintf("%d", ( hex()/4 ))|e'
812
当您在替换中使用 /
字符作为分隔符时,表达式中出现的所有 /
都将被视为分隔符。如果你想让一个被视为其他东西(例如除法运算符),你需要将它转义(通过在它前面放置 \
)。
另一种选择是为您的替换选择不同的分隔符。在我的第三个示例中,我改为使用 |
。在这种情况下,/
不再被视为特殊的并且不需要转义。