2010-05-27 54 views
1

我有两个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/,如:

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

回答

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变量。

3

也许

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

做到了。

2

unlessif not相同。通过你写的声明的方式来看,我猜你指的是以下几点:

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

(虽然,你可能意味着or代替and?)

+0

另请注意,它更好地使用&&而不是'和'。 '和'的优先级低于&& – 2010-06-07 17:06:24