comandos - ¿Cómo puede la impresión de Perl agregar una nueva línea por defecto?
comandos perl (8)
En Perl 6 existe, la función say
En Perl, la mayoría de mis declaraciones print
toman la forma
print "hello." . "/n";
¿Hay alguna manera de evitar que todos los molestos "/ n" estén por ahí?
Sé que podría hacer una función nueva como myprint
que se agrega automáticamente / n, pero sería bueno si pudiera anular la print
existente.
La forma en que escribe la declaración impresa es innecesariamente detallada. No es necesario separar la nueva línea en su propia cadena. Esto es suficiente.
print "hello./n";
Esta realización probablemente hará que su codificación sea más fácil en general.
Además de use feature "say"
o use 5.10.0
o use Modern::Perl
para obtener la función integrada, voy a proxeneta perl5i que activa muchas características perdidas de Perl 5 de manera predeterminada.
Perl 6 tiene la función say
que se agrega automáticamente /n
.
También puede usar say
en Perl 5.10 o 5.12 si agrega
use feature qw(say);
al comienzo de tu programa O puede usar Modern::Perl para obtener esta y otras características.
Vea la característica perldoc para más detalles.
Puede escribir una forma de uso más legible 5.010 :
use v5.10;
Puede usar la opción -l
en el encabezado she-bang:
#!/usr/bin/perl -l
$text = "hello";
print $text;
print $text;
Salida:
hello
hello
Quizás desee cambiar su separador de registro de salida a avance de línea con:
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
Actualización: mi respuesta habla de capacidad más que de conveniencia. No considero que agregar "/ n" al final de las líneas sea una tarea "molesta", pero si alguien realmente quiere evitarlas, esta es una manera. Si tuviera que mantener un poco de código que utiliza esta técnica, probablemente lo refactorizaría pronto.
Si Perl 5.10+ no es una opción, aquí hay una aproximación rápida y sucia. No es exactamente lo mismo, ya que dice que tiene algo de magia cuando su primer arg es un asa, pero para imprimir en STDOUT:
sub say {print @_, "/n"}
say ''hello'';
Si está atascado con pre-5.10, entonces las soluciones proporcionadas arriba no replicarán completamente la función de say
. Por ejemplo
sub say { print @_, "/n"; }
No funcionará con invocaciones tales como
say for @arr;
o
for (@arr) {
say;
}
... porque la función anterior no actúa sobre la print
$_
like global implícita y la función de say
real.
Para replicar más de cerca el perl 5.10+ say
que quieres esta función
sub say {
if (@_) { print @_, "/n"; }
else { print $_, "/n"; }
}
Que ahora actúa así
my @arr = qw( alpha beta gamma );
say @arr;
# OUTPUT
# alphabetagamma
#
say for @arr;
# OUTPUT
# alpha
# beta
# gamma
#
La respuesta incorporada en Perl6 se comporta de manera un poco diferente. say @arr
con say @arr
o @arr.say
no solo concatenará los elementos de la matriz, sino que los imprimirá separados con el separador de lista. Para replicar esto en Perl5, harías esto
sub say {
if (@_) { print join($", @_) . "/n"; }
else { print $_ . "/n"; }
}
$"
es la variable de separador de lista global, o si está utilizando English.pm
entonces es $LIST_SEPARATOR
Ahora actuará más como perl6, como tal
say @arr;
# OUTPUT
# alpha beta gamma
#