2012-02-01 2 views
2
php -R '$count++' -E 'print "$count\n";' < somefile 

affichera le nombre de lignes dans 'unfichier' (ce n'est pas ce que je ferais réellement).perl ligne de commande équivalent de php -E

Je cherche à émuler le commutateur -E dans une commande perl.

perl -ne '$count++' -???? 'print "$count\n"' somefile 

Est-ce possible?

Répondre

6

Vous pouvez utiliser un bloc pour ajouter du code END { ... } qui doit être exécuté après la boucle:

perl -ne '$count++; END { print "$count\n"; }' somefile 

Vous pouvez facilement mettre dans son propre argument -e, si vous voulez plus séparé:

perl -ne '$count++;' -e 'END { print "$count\n"; }' somefile 

Voir aussi:

+0

Vous êtes le seul à avoir compris la question. Merci. –

6

Cela devrait être ce que vous cherchez:

perl -nle 'END { print $. }' notes.txt 
+0

Ahh, c'est ça. Merci. Merci pour le '-l' aussi. Je ne savais pas à ce sujet non plus. –

+0

Pour beaucoup plus, voir man perlrun ou http://perldoc.perl.org/perlrun.html –

10

TIMTOWTDI

Vous pouvez utiliser l'opérateur Eskimo Kiss:

perl -nwE '}{ say $.' somefile 

Cet opérateur est moins magique que l'on pense, comme on le voit si nous Deparse le one-liner:

$ perl -MO=Deparse -nwE '}{say $.' somefile 
BEGIN { $^W = 1; } 
BEGIN { 
    $^H{'feature_unicode'} = q(1); 
    $^H{'feature_say'} = q(1); 
    $^H{'feature_state'} = q(1); 
    $^H{'feature_switch'} = q(1); 
} 
LINE: while (defined($_ = <ARGV>)) { 
    (); 
} 
{ 
    say $.; 
} 
-e syntax OK 

Il pointe simplement sur un ensemble supplémentaire d'accolades, ce qui fait que le code suivant se termine en dehors de la boucle while implicite.

Ou vous pouvez vérifier la fin du fichier.

perl -nwE 'eof and say $.' somefile 

Avec plusieurs fichiers, vous obtenez une somme cumulée imprimée pour chacun d'entre eux.

perl -nwE 'eof and say $.' somefile somefile somefile 
10 
20 
30 

Vous pouvez fermer le handle de fichier pour obtenir un nombre non cumulatif:

perl -nwE 'if (eof) { say $.; close ARGV }' somefile somefile somefile 
10 
10 
10 
+0

+1: explication solide. – Zaid

+0

@Zaid C'est une bonne astuce, merci de l'avoir partagé. Je viens juste de me rendre compte que ça ne marchera pas avec le commutateur '-p', comme il est dit dans la question à laquelle je suis lié - seulement' -n'. Avec '-p' il deviendra' while (<>) {(); } {code} continuez {print} '. – TLP