2010-03-21 12 views
10

Quale versione preferisci?Come posso eseguire il pad di parte di una stringa con spazi, in 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; 

Opzione 1:

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

Opzione 2:

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

say "$key$value" 
+2

$ key. = '' X $ p. $ Chiederà; – MkV

+0

In genere inserisco tutti i segni di punteggiatura direttamente (senza spazio) dopo l'ultima parola. Per produrre una tabella, userei 'format'. – Svante

+0

Qualcuno che capisce Perl può modificare il titolo di questa domanda per essere più descrittivo? – Earlz

risposta

7

non mi piace l'opzione 2 in quanto introduce un caso speciale inutile.

avrei refactoring a termine la costruzione del suffisso messaggio:

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

    # Later... 

    $key .= $suffix ; 
25

Io preferirei

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

o

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

invece di tutta questa roba strana.

Da sprintf documentazione:

Le opzioni di

'-' Il valore convertito deve essere lasciata regolato sul confine del campo. (L'impostazione predefinita è giusta giustificazione.) Il valore convertito viene riempito a destra con spazi vuoti, piuttosto che a sinistra con spazi vuoti o zero. Un '-' sostituisce un 0 se vengono entrambi forniti.

La larghezza del campo

Una stringa cifra decimale facoltativo (con diverso da zero prima cifra) indicando larghezza minima del campo. Se il valore convertito ha meno caratteri della larghezza del campo, verrà riempito con spazi a sinistra (o a destra, se è stato assegnato il flag di regolazione a sinistra). Invece di una stringa cifra decimale si può scrivere '*' o '*m$' (per alcuni numeri decimali interi m) per specificare che la larghezza del campo è data nell'argomento successivo, o nell'argomento m-esimo, rispettivamente, che deve essere di tipo int. Una larghezza di campo negativa viene considerata come un flag '-' seguito da una larghezza di campo positiva. In nessun caso una larghezza di campo inesistente o piccola causa il troncamento di un campo; se il risultato di una conversione è più ampio della larghezza del campo, il campo viene espanso per contenere il risultato della conversione.

+0

Sarebbe fantastico poter aggiungere una modifica che spieghi le direttive dello sprint per i futuri utenti. Soprattutto perché questo è l'approccio migliore. – insaner

+0

@Hynek -Pichi- Vychodil, Grazie per aver condiviso questo pensiero. – Robie

1

mi sembra un po 'strano, ma funziona (fino ad ora):

#!/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

Chiamami vecchia scuola, ma mi piacerebbe utilizzare printf() o sprintf():

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

Quella sinistra giustifica la chiave $ stringa in 33 spazi, aggiunge $ prompt e $ valore e una nuova riga.Se volessi calcolare la lunghezza per la prima parte in modo dinamico:

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

Poiché si tratta di una linea invece di della domanda 4 (opzione 1) o 6 (opzione 2), i punteggi favorevolmente sulla scala succinctness.

+0

Poiché ho fatto una domanda sulle migliori pratiche, è difficile ora che non sia d'accordo con la tua risposta - con printf il codice sembra più bello, con my_print l'output. –

Problemi correlati