2010-03-21 15 views
10

¿Qué versión preferirías?¿Cómo puedo rellenar parte de una cadena con espacios, en Perl?

#!/usr/bin/env perl 
use warnings; 
use strict; 
use 5.010; 

my $p = 7; # 33 
my $prompt = ' : '; 
my $key = 'very important text'; 
my $value = 'Hello, World!'; 

my $length = length $key . $prompt; 
$p -= $length; 

Opción 1:

$key = $key . ' ' x $p . $prompt; 

Opción 2:

if ($p > 0) { 
    $key = $key . ' ' x $p . $prompt; 
} 
else { 
    $key = $key . $prompt; 
} 

say "$key$value" 
+2

$ key. = '' X $ p. $ prompt; – MkV

+0

En general, pongo todos los signos de puntuación directamente (sin espacio) después de la última palabra. Para generar una tabla, usaría 'format'. – Svante

+0

¿Puede alguien que entiende Perl modificar el título de esta pregunta para que sea más descriptivo? – Earlz

Respuesta

7

no me gusta la opción 2, ya que introduce un caso especial innecesaria.

Me refactorizar a cabo la construcción del sufijo indicador:

# Possible at top of program 
    my $suffix = (' ' x $p) . $prompt; 

    # Later... 

    $key .= $suffix ; 
25

yo preferiría

sprintf "%-7s : %s", $key, $value; 

o

sprintf "%-*s : %s", $p, $key, $value; 

en lugar de todo este material extraño.

De sprintf documentación:

Los personajes bandera

'-' El valor convertido es justificado a la izquierda en el límite del campo. (El valor predeterminado es la justificación correcta). El valor convertido se rellena a la derecha con espacios en blanco, en lugar de a la izquierda con espacios en blanco o ceros. A '-' prevalece un 0 si se dan ambos.

la anchura del campo

Una cadena de dígitos decimales opcional (con distinto de cero primer dígito) que especifica un ancho de campo mínimo. Si el valor convertido tiene menos caracteres que el ancho del campo, se rellenará con espacios a la izquierda (o derecha, si se ha otorgado el indicador de ajuste a la izquierda). En lugar de una cadena de dígitos decimales, puede escribir '*' o '*m$' (para un entero decimal m) para especificar que el ancho del campo se da en el siguiente argumento, o en el argumento m-th, respectivamente, que debe ser del tipo int. Se toma un ancho de campo negativo como un indicador '-' seguido de un ancho de campo positivo. En ningún caso un ancho de campo inexistente o pequeño causa el truncamiento de un campo; si el resultado de una conversión es más ancho que el ancho del campo, el campo se expande para contener el resultado de la conversión.

+0

Sería genial si pudiera agregar una edición que explique las directivas de sprintf para futuros buscadores. Especialmente porque este es el mejor enfoque. – insaner

+0

@Hynek -Pichi- Vychodil, Gracias por compartir esta idea. – Robie

1

me parece un poco raro, pero esto funciona (hasta ahora):

#!/usr/bin/env perl 
use warnings; use strict; 
use 5.010; 
use utf8; 
use Term::Size; 
my $columns = (Term::Size::chars *STDOUT{IO})[0]; 
binmode STDOUT, ':encoding(UTF-8)'; 
use Text::Wrap; 
use Term::ANSIColor; 

sub my_print { 
    my($key, $value, $prompt, $color, $p) = @_; 
    my $length = length $key.$prompt; 
    $p -= $length; 
    my $suff = (' ' x $p) . $prompt; 
    $key .= $suff; 
    $length = length $key; 
    my $col = $columns - $length; 
    $Text::Wrap::columns = $col; 
    my @array = split /\n/, wrap ('','', $value) ; 
    $array[0] = colored($key, $color) . $array[0]; 
    for my $idx (1..$#array) { 
    $array[$idx] = (' ' x $length) . $array[$idx]; 
    } 
    say for @array; 
} 

my $prompt = ' : '; 
my $color = 'magenta'; 
my $p = 30; 
my $key = 'very important text'; 
my $value = 'text ' x 40; 

my_print($key, $value, $prompt, $color, $p); 
5

Me llaman la vieja escuela, pero que haría uso de printf() o sprintf():

printf "%-33s%s%s\n", $key, $prompt, $value; 

Que justificó la cadena $ key en 33 espacios, agrega $ prompt y $ value y una nueva línea.Si quería calcular la longitud de la primera parte de forma dinámica:

printf "%-*s%s%s\n", $len, $key, $prompt, $value; 

Dado que es una línea en lugar de (opción 1) de la pregunta 4 o 6 (opción 2), se apunta favorablemente en la escala de concisión.

+0

Desde que hice una pregunta acerca de las mejores prácticas, ahora me resulta difícil no estar de acuerdo con su respuesta: con printf el código se ve mejor, con my_print como salida. –

Cuestiones relacionadas