2011-12-28 30 views
2

在工作中我們採用這種結構,例如,找出所有的文件,自上次更新的SVN改變的名稱和對其執行的svn add命令:使用perl,而不是grep的

svn st | grep '^\?' | perl -pe 's/^\s*\?// | xargs -L 1 svn add'

我想:「我希望我可以使用Perl單行腳本而不是grep」。

是否有可能做到?

P.S .:我發現在Perl中有一個m//運算符。我認爲它應該用在ARGV變量上(不知道它們在Perl中的名字 - 可能是$_數組或僅僅是$1-like變量?)。

+0

這有什麼錯的grep?如果你需要PCRE,你可以使用'grep -P' ... – kennytm 2011-12-28 14:41:42

+0

是的,我可以。但我希望我可以使用perl =) – shybovycha 2011-12-28 14:44:33

回答

4

簡單:

svn st | perl -lne 'print if s/^\s*\?//' | xargs -L 1 svn add 

或者在Perl做的一切:

perl -e '(chomp, s/^\s*\?//) && system "svn", "add", $_ for qx(svn st)' 
+0

以及'$ _'變量的含義是什麼? – shybovycha 2011-12-28 15:07:48

+1

'expr for list'的意思是「將特殊全局變量'_ _'依次分配給'list'的每個元素,每次評估'expr'」。有關'$ _'和其他每個特殊Perl變量的更多信息,請參閱'perldoc perlvar'。 – Sean 2011-12-28 15:18:05

+0

非常感謝! – shybovycha 2011-12-28 15:35:49

1

我覺得這是你想要

svn st | perl -ne 's/^\s*\?// && print' | xargs -L 1 svn add 

希望它可以幫助什麼;)

2

可以使用perl單行r,但它仍然依賴於shell命令,除非你能找到一個模塊來處理svn調用。但不確定它會不會提高可讀性。

perl -we 'for (qx(svn st)) { if (s/^\s*\?//) { system "svn", "add", $_ } }' 

在一個腳本版本:

use strict; 
use warnings; 

for (qx(svn st)) { 
    if (s/^\s*\?//) { 
     system "svn", "add", $_; 
    } 
}