web-dev-qa-db-fra.com

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

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

print "hello." . "\n";

Existe-t-il un bon moyen d’éviter de laisser traîner tous les satanés "\ n" s?

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 print existant.

82
Mike

Perl 6 a la fonction 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. Ou vous pouvez utiliser Modern :: Perl pour obtenir ceci et d’autres fonctionnalités.

Voir fonctionnalité perldoc pour plus de détails.

88
Josh Kelley

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

#!/usr/bin/Perl -l

$text = "hello";

print $text;
print $text;

Sortie:

hello
hello
29
jaypal singh

Si Perl 5.10+ n'est pas une option, voici une approximation rapide et approximative. Ce n'est pas exactement pareil, puisque say a de la magie quand son premier argument est une poignée, mais pour imprimer sur STDOUT:

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

say 'hello';
24
Eric Strom

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

print "hello.\n";

Cette réalisation facilitera probablement votre codage en général.

En plus d'utiliser use feature "say" ou use 5.10.0 ou use Modern::Perl pour obtenir la fonctionnalité say intégrée, je vais utiliser pimp Perl5i , qui active par défaut de nombreuses fonctionnalités sensibles Perl 5.

19
Schwern

Peut-être que vous voulez changer votre séparateur d’enregistrement de sortie en 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 parle de capacité plutôt que d'opportunité. Je ne considère pas que l’ajout de "\ n" à la fin des lignes soit une tâche "fastidieuse", mais si quelqu'un veut vraiment les éviter, c’est un moyen. Si je devais conserver un peu de code qui utilise cette technique, je le refacturerais sans doute à l’avant.

9
David M

En Perl 6, il y a la say fonction

3
Michael Mrozek

Si vous êtes bloqué avec les versions antérieures à la version 5.10, les solutions fournies ci-dessus ne répliqueront pas complètement la fonction say. Par exemple

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

Ne fonctionnera pas avec des invocations telles que

say for @arr;

ou 

for (@arr) {
    say;
}

... parce que la fonction ci-dessus n'agit pas sur le $_ global implicite comme print et la fonction réelle say.

Pour reproduire plus fidèlement Perl 5.10+ say vous voulez cette fonction

sub say {
    if (@_) { print @_, "\n"; }
    else { print $_, "\n"; }
}

Qui agit maintenant comme ceci

my @arr = qw( alpha beta gamma );
say @arr;
# OUTPUT
# alphabetagamma
#
say for @arr;
# OUTPUT
# alpha
# beta
# gamma
#

La variable say intégrée à Perl6 se comporte un peu différemment. L'invoquer avec say @arr ou @arr.say ne concaténera pas simplement les éléments du tableau, mais les imprimera séparés, séparés par le séparateur de liste. Pour reproduire cela en Perl5, vous feriez ceci

sub say {
    if (@_) { print join($", @_) . "\n"; }
    else { print $_ . "\n"; }
}

$" est la variable de séparation de liste globale, ou si vous utilisez English.pm, sa valeur est $LIST_SEPARATOR

Il va maintenant agir plus comme Perl6, comme si

say @arr;
# OUTPUT
# alpha beta gamma
#
1
Joshua

Voici ce que j'ai trouvé sur https://perldoc.Perl.org/perlvar.html :

$\ Le séparateur d'enregistrement de sortie pour l'opérateur d'impression. Si défini, cette valeur est imprimé après le dernier argument de print. La valeur par défaut est undef.

Vous ne pouvez pas appeler output_record_separator () sur un handle, uniquement en tant que méthode statique. Voir IO :: Handle.

Mnémonique: vous définissez $\au lieu d’ajouter "\ n" à la fin de l’impression. Aussi, c'est Tout comme $ /, mais c'est ce que vous obtenez "en retour" de Perl.

exemple: 

$\ = "\n";
print "a newline will be appended to the end of this line automatically";
0
gabrielhofer560