funciones comandos perl printing newline

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 #