为什么变量会被perl中的先前命令替换?

时间:2013-03-27 16:14:25

标签: perl csh

我正在尝试使用perl one liner替换文件中第一次出现的模式。

>touch tmp
>perl -p -i.bak -e '++$seen if( !$seen && s/alpha/beta/);' tmp

然后按Enter键。屏幕上显示以下信息。

perl -p -i.bak -e '++$seen if( tmpseen && s/alpha/beta/);' tmp

请注意,!$seen已替换为tmpseen

为什么会这样?

感谢。

2 个答案:

答案 0 :(得分:4)

正如kjprice所提到的!$由shell扩展。一种可能的解决方案是使用运算符'not'而不是运算符!。

perl -p -i.bak -e '++$seen if( (not $seen) && s/alpha/beta/);' tmp

由于运算符'not'

的优先级较低,因此存在括号

答案 1 :(得分:3)

您可以使用\转义任何csh特殊字符:

 perl -p -i.bak -e '++$seen if( \!$seen && s/alpha/beta/);' tmp