Как мне совместить два условия в Perl? - PullRequest
1 голос
/ 27 мая 2010

У меня есть два лайнера Perl one:

perl  -pe "s/\b$a\b/$b/g if m/param1 /"  test

и

perl  -pe "s/\b$a\b/$b/g unless /^#/" test

Как мне объединить if m/somthing/ и unless /something/, например:

[root@localhost tmp]#  perl  -pe "s/\b$a\b/$b/g if m/param1/ unless /^#/"  test
syntax error at -e line 1, near "m/param1/ unless"

Ответы [ 3 ]

3 голосов
/ 27 мая 2010

Может

perl  -pe "s/\b$a\b/$b/g if m/param1/ && ! /^#/"  test

делает это.

2 голосов
/ 27 мая 2010

unless совпадает с if not. Судя по тому, как вы написали заявление, я предполагаю, что вы имеете в виду следующее:

 perl  -pe "s/\b$a\b/$b/g if m/param1/ and not /^#/"  test

(хотя, возможно, вы имели в виду or вместо and?)

0 голосов
/ 27 мая 2010

В несвязанной ноте вы можете добавить экранирующие последовательности \Q и \E около $a в регулярном выражении:

perl  -pe "s/\b\Q$a\E\b/$b/g if m/param1 /"  test

Они избегают любых символов, которые являются специальными для регулярных выражений. Если вы хотите, чтобы $a содержало регулярное выражение, вам, вероятно, следует перенести в него утверждения границы слова (\b).

Независимо от того, что вы решите делать, вам нужно быть осторожным со значениями в $a и $b. Например:

a="/"
b="slash"
perl  -pe "s/\b\Q$a\E\b/$b/g if m/param1 /"  test

вызовет синтаксическую ошибку. Одним из решений этой проблемы является не использовать переменные среды для замены кода. Perl позволяет вам получить доступ к среде через хэш %ENV:

perl -pe 's/\b\Q$ENV{a}\E\b/$ENV{b}/g if m/param1 /' test

Обратите внимание на использование одиночных тиков, чтобы избежать обработки $ENV в качестве переменной оболочки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...