Perl: Почему нельзя делить? - PullRequest
       10

Perl: Почему нельзя делить?

0 голосов
/ 12 февраля 2019

Почему не работает деление?

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 ]

0 голосов
/ 12 февраля 2019

Либо используйте другой разделитель для замены, либо вам нужно будет выйти из деления с обратной косой чертой:

echo 'cb0' | perl -p -e 's/(\w{3})/sprintf("%d", ( hex($1)\/4 ))/e'
0 голосов
/ 12 февраля 2019

Это не работает:

$ 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

Когда вы используете символ / в качестве символа разделителя в подстановке, тогда все вхождения / в вашем выражении будут рассматриваться как разделители.Если вы хотите, чтобы один из них был виден как что-то другое (например, оператор деления), вам нужно его избежать (поставив перед ним \).

Другой вариант - выбрать другой разделитель дляваша замена.В третьем примере я переключился на использование |.В этом случае / больше не рассматривается как особый и не нуждается в экранировании.

0 голосов
/ 12 февраля 2019

Разделитель по умолчанию для подстановки s /// не сбалансирован, поэтому вы получите ошибку.Это потому, что вы делите 1 доллар на 4, и он вводит еще один символ «/».Поэтому, чтобы быть в безопасности, используйте какой-то другой символ, кроме того, который будет портить выражение.В этом случае лучше использовать <> в качестве разделителя

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

, когда вы конвертируете s /// с другими разделителями, вам нужно соединить <...>, (...), [...]а также {...}.Я выбрал <>, поскольку его нет в выражении.

...