2011-12-28 10 views
2

Au travail, nous utilisons cette construction, par exemple, connaître les noms de tous les fichiers, modifiés dans SVN depuis la dernière mise à jour et exécuter une commande svn add sur eux:Utiliser perl au lieu de grep

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

Et j'ai pensé: "Je voudrais pouvoir utiliser Perl une ligne-script au lieu de grep".

Est-il possible de faire et comment?

P.S .: J'ai trouvé qu'il y a un opérateur m// en Perl. Je pense qu'il devrait être utilisé sur les variables ARGV (ne connaissent pas leurs noms en Perl - peut-il s'agir du tableau $_ ou simplement des variables $1?).

+0

Quel est le problème avec grep? Vous pouvez utiliser 'grep -P' si vous avez besoin de PCRE ... – kennytm

+0

ouais, je pourrais. mais je voudrais pouvoir utiliser perl =) – shybovycha

Répondre

4

Facile:

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

Ou tout faire en Perl:

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

et quelle est la signification de cette variable '$ _' ??? – shybovycha

+1

'expr pour list' signifie" assigner la variable globale spéciale '$ _' à chaque élément de' list', en évaluant 'expr' à chaque fois." Voir 'perldoc perlvar' pour plus d'informations sur' $ _' et sur toutes les autres variables Perl spéciales. – Sean

+0

Merci beaucoup! – shybovycha

1

Je pense que c'est ce que vous voulez

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

Hope it helps;)

2

Il est possible d'utiliser une ligne perl r, mais il s'appuiera toujours sur les commandes shell, sauf si vous pouvez trouver un module pour gérer les appels svn. Je ne suis pas sûr que cela augmentera réellement la lisibilité des performances.

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

Dans une version de script:

use strict; 
use warnings; 

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