98 votes

Comment l'impression de Perl peut-elle ajouter une nouvelle ligne par défaut ?

En Perl, la plupart de mes print Les déclarations prennent la forme

print "hello." . "\n";

Existe-t-il un moyen agréable d'éviter de garder tous les embêtants " \n "qui traînent ?

Je sais que je pourrais créer une nouvelle fonction telle que myprint qui ajoute automatiquement \n mais ce serait bien si je pouvais remplacer le système existant par un autre. print .

10 votes

Si votre réponse inclut $\, veillez à ce qu'elle soit accompagnée d'une liste de mises en garde concernant la définition de variables globales à effet invisible. Bien qu'elle soit très intelligente et qu'elle réponde techniquement à la question, il est également très dangereux de la remettre sans qualification à un débutant.

1 votes

perldoc perlvar décrit la plupart des mises en garde, pourquoi les répéter ici ?

5 votes

@David, parce qu'un hacker aléatoire va chercher les réponses ici plutôt que dans perldoc, s'en contenter, et ne sera même pas au courant des avertissements !

100voto

Josh Kelley Points 24438

Perl 6 dispose de l'option say qui ajoute automatiquement \n .

Vous pouvez également utiliser say dans Perl 5.10 ou 5.12 si vous ajoutez

use feature qw(say);

au début de votre programme. Vous pouvez aussi utiliser Modern::Perl pour obtenir cette fonctionnalité et d'autres.

Voir Fonctionnalité perldoc pour plus de détails.

7 votes

En fait, tout ce que vous avez à faire est use 5.012; o use 5.010; pour l'avoir si vous utilisez ces nouvelles versions. perl s.

0 votes

N'est-il pas raisonnable de supposer qu'à moins que Perl 6 ne soit spécifiquement mentionné, la question se réfère à Perl 5 ?

40voto

jaypal Points 34440

Vous pouvez utiliser le -l dans l'en-tête she-bang :

#!/usr/bin/perl -l

$text = "hello";

print $text;
print $text;

Salida:

hello
hello

3 votes

Très bien. Plus sur perl options, y compris ce que -l fait, aquí .

24voto

Eric Strom Points 30894

Si Perl 5.10+ n'est pas une option, voici une approximation rapide et sale. Ce n'est pas exactement la même chose, puisque say a une certaine magie lorsque son premier argument est un handle, mais pour l'impression vers STDOUT :

sub say {print @_, "\n"}

say 'hello';

20voto

Schwern Points 33677

La façon dont vous écrivez votre déclaration d'impression est inutilement verbeuse. Il n'est pas nécessaire de séparer la nouvelle ligne dans sa propre chaîne. C'est suffisant.

print "hello.\n";

Cette prise de conscience facilitera probablement votre codage en général.

En plus d'utiliser use feature "say" o use 5.10.0 o use Modern::Perl pour obtenir la fonction intégrée say fonctionnalité, je vais faire du maquettage perl5i qui active par défaut un grand nombre de fonctionnalités manquantes de Perl 5.

10voto

David M Points 2605

Vous voulez peut-être changer votre séparateur d'enregistrement de sortie pour un saut de ligne avec :

local $\ = "\n";

$ perl -e 'print q{hello};print q{goodbye}' | od -c
0000000    h   e   l   l   o   g   o   o   d   b   y   e                
0000014
$ perl -e '$\ = qq{\n}; print q{hello};print q{goodbye}' | od -c
0000000    h   e   l   l   o  \n   g   o   o   d   b   y   e  \n        
0000016

Mise à jour : ma réponse porte sur la capacité plutôt que sur l'opportunité. Je ne considère pas qu'ajouter " \n " à la fin des lignes pour être une corvée " pesante ", mais si quelqu'un veut vraiment les éviter, c'est un moyen. Si je devais maintenir un bout de code qui utilise cette technique, je le remanierais probablement pronto.

6 votes

Non, s'il vous plaît, ne faites pas ça. Bien qu'il s'agisse techniquement d'une réponse correcte, l'utilisation d'une variable spéciale pour quelque chose d'aussi trivial que cela représente un fardeau pour la maintenance à l'avenir.

1 votes

@tsee Je suis tout à fait d'accord, en fait. Comme j'ai modifié ma réponse pour l'indiquer, ma réponse décrit la capacité, même si on ne la recommanderait pas comme pratique générale.

0 votes

Le véritable danger vient du fait que tout le code ajoutera désormais des nouvelles lignes, même le code des modules d'autres personnes qui ne s'y attendaient pas. Imaginez un code de réseau qui aurait envoyé le message "helo\r\n" qui envoie maintenant "helo\r\n\n" .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X