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.
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.
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
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';
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.
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.
En Perl 6, il y a la say
fonction
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
#
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";