2013-03-27 72 views
2

我試圖用perl一個班輪只替換文件中第一次出現的模式。爲什麼變量被perl中的前一個命令替換?

>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取代。

這是怎麼發生的?

謝謝。

+3

這是由於CSH。 '!$'擴展到前一個命令的最後一個參數。我假設。 – kjprice 2013-03-27 16:18:18

+0

@kjprice的確如此。這似乎是這種情況。我現在能做什麼? – user13107 2013-03-27 16:21:20

+0

@ user13107我不使用csh,但我在猜測'if(\!$ seen' will be – kjprice 2013-03-27 16:25:44

回答

3

您可以逃脫任何CSH特殊字符\

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

正如kjprice所提到的那樣!$通過shell進行擴展。一種可能的解決方案是使用操作員而不是操作員!

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

小括號那裏,因爲運營商「不」的優先級較低的

+0

謝謝,您的解決方案也不錯。 – user13107 2013-03-27 16:32:35