2010-05-24 9 views
72

En Perl mayoría de mis declaraciones print toman la forma¿Cómo puede la impresión de Perl agregar una nueva línea por defecto?

print "hello." . "\n"; 

¿Hay una buena manera de evitar que se mantengan todos los molestos "\ n" s por ahí?

Sé que podría hacer una nueva función como myprint que se agrega automáticamente \ n, pero sería bueno si pudiera anular la existente print.

+9

Si su respuesta incluye $ \ asegúrese de que viene con una lista de advertencias sobre el establecimiento de variables globales con efecto invisible. Si bien es muy inteligente y técnicamente responde a la pregunta, también es muy peligroso entregarlo sin reservas a un novato. – Schwern

+1

'perldoc perlvar' describe la mayoría de las advertencias, ¿por qué profundizarlas aquí? –

+4

@David, porque algún hacker aleatorio buscará aquí las respuestas en lugar de perldoc, se sentirá satisfecho con ellas y ¡ni siquiera sabrá sobre las advertencias! –

Respuesta

84

Perl 6 tiene la función say que anexa automáticamente \n.

También puede utilizar say en Perl 5.10 o 5.12 si se agrega

use feature qw(say); 

al comienzo de su programa. O puede usar Modern::Perl para obtener esta y otras características.

Ver perldoc feature para más detalles.

+2

+1 por mencionar el paquete requerido – Mike

+6

De hecho, todo lo que tiene que hacer es 'use 5.012;' o 'use 5.010;' para obtenerlo si está ejecutando esos 'perl's más nuevos. –

+0

¿No es seguro suponer que a menos que se mencione específicamente a Perl 6, la pregunta se refiere a Perl 5? –

3

En Perl 6 hay, la say función

+14

También está en 5.010 :-) – nc3b

+0

@ nc3b Ah, práctico –

23

Si Perl 5.10+ no es una opción, aquí hay una aproximación rápida y sucia. No es exactamente el mismo, ya que por ejemplo tiene un poco de magia cuando su primer argumento es un mango, pero para la impresión en STDOUT:

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

say 'hello'; 
+1

@bernie Su enlace ya no existe – TheWanderingMind

17

La forma en que está escribiendo su sentencia print es innecesariamente prolijo. 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 utilizar use feature "say" o use 5.10.0 o use Modern::Perl para obtener el construido en función say, voy a proxeneta perl5i que se convierte en una gran cantidad de desaparecidos sensibles Perl 5 características por defecto.

+11

facepalm.jpg ... – Mike

9

Tal vez usted quiere cambiar su separador de registro de salida de 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 la capacidad en lugar 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.

+5

o simplemente 'perl -le 'imprime q {hello}; imprime q {adiós}' ' – ysth

+6

No, por favor no hagas eso. Si bien técnicamente es una respuesta correcta, usar una variable especial para algo tan trivial como esto es una carga de mantenimiento en el futuro. – tsee

+1

@tsee Estoy completamente de acuerdo, en realidad. Mientras editaba mi respuesta para indicar, mi respuesta describe la capacidad, incluso si uno no lo recomendaría como práctica general. –

0

Puede escribir la forma más legible de uso 5.010:

use v5.10; 
22

Usted puede utilizar la opción -l en la cabecera de ella-bang:

#!/usr/bin/perl -l 

$text = "hello"; 

print $text; 
print $text; 

Salida:

hello 
hello 
+2

Muy agradable. Más sobre las opciones de 'perl', incluido lo que' -l' está haciendo, [aquí] (http://www.perl.com/pub/2004/08/09/commandline.html). – ruffin

+1

Debido a que es una aplicación global, esta es una mala práctica en todo menos en frases simples y en el más mínimo de los scripts. – Schwern

1

Si está atrapado con pre-5.10 , entonces las soluciones proporcionadas anteriormente no replicarán completamente la función say. Por ejemplo

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

no funcionará con invocaciones como

say for @arr; 

o

for (@arr) { 
    say; 
} 

... porque la función anterior no actúa sobre lo implícito mundial $_ como print y la función real say.

Para reproducir más de cerca el Perl 5.10+ say desea esta función

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

que ahora actúa como esto

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

El say orden interna en Perl6 se comporta de manera diferente. Invocarlo 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 que haría esto

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

$" es la variable global separador de lista, o si está usando English.pm entonces es es $LIST_SEPARATOR

Ahora actuará más como Perl6, al igual que

say @arr; 
# OUTPUT 
# alpha beta gamma 
# 
Cuestiones relacionadas