2011-12-28 34 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", $_; 
    } 
}