如何在Perl中结合两个条件?

时间:2010-05-27 09:33:28

标签: perl

我有两个Perl一个衬垫:

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 个答案:

答案 0 :(得分:3)

也许

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

做到了。

答案 1 :(得分:2)

unlessif not相同。根据您撰写声明的方式判断,我猜您的意思如下:

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

(虽然,您可能需要or代替and?)

答案 2 :(得分:0)

在不相关的注释中,您可能希望在正则表达式$a周围添加\Q and \E转义序列:

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视为shell变量。