9
votes

Numéro de ligne d'un fichier à Perl

in awk code> si je donne plus d'un fichier sous forme d'argument sur AWK code>, il existe deux variables spéciales:

nr code> = numéro de ligne correspondant à toutes les lignes de tous les fichiers. p>

fnr code> = numéro de ligne du fichier actuel. p>

Je sais que dans Perl, $. code> correspond à nr code> (ligne actuelle parmi les lignes dans tous les fichiers). p>

y a-t-il quelque chose de comparable à FNR code> de Awk à Perl aussi? P>

Disons que j'ai une ligne de commande: p> xxx pré>

Cela devrait me donner la sortie comme: p>

file1.txt 1
file1.txt 2
file2.txt 1


2 commentaires

Imprimer "Fichier:", Fichier "," Ligne: ", Ligne ," \ n "; Vous devriez également consulter CATONMAT.NET/BLOG/PERL- one-liners - expliqué-part-deux


Andy est probablement destiné à nommer __ fichier __ et __ ligne __ , mais j'ai oublié le formatage du code.


3 Réponses :


5
votes

Il n'y a pas de telle variable dans Perl. Mais vous devriez étudier EOF pour pouvoir écrire quelque chose comme XXX


1 commentaires

@CHOROBA: La réponse à la question de l'OP est dans le EOF Documentation que vous avez liée!



6
votes

En réalité, le eof code> documentation montre un moyen de faire ceci:

$ perl -ne 'print "$ARGV : $_" if $. == 1; } continue { close ARGV if eof;' *txt


3 commentaires

La dernière ligne ne manque pas de "{" et a "}"?


Search.cpan.org/dist/perlsecret/lib/... explique ce que c'est et comment ça fonctionne.


La doublure est équivalente à: perl -ne 'impression "$ argv: $ _" si $. == 1; fermer argv si eof '* txt . Le bloc continuer n'est plus nécessaire car il n'y a pas d'instruction suivante à l'intérieur de la boucle principale.



0
votes

Je trouve que cette situation est un très grand inconvénient pour utiliser Perl. Bien que cette réponse soit sous-optimale, performance-sage et seulement des situations impliquant xargs code>, j'ai généralement trouvé la solution d'emploi que j'utilise 95% du temps. Donc, le scénario de problème:

£ git ls-files -z | xargs -0 -n1 perl -ne 'print "$ARGV:$.\t$_" if /#define oom/'
file.h:43       #define oom() exit(-1)


0 commentaires