2010-03-21 4 views
10

Какой вариант вы предпочитаете?Как я могу поместить часть строки с пробелами в 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; 

Вариант 1:

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

Вариант 2:

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

say "$key$value" 
+2

$ key. = '' X $ p. $ Быстроты; – MkV

+0

Я бы поставил все знаки препинания сразу (без пробела) после последнего слова. Чтобы вывести таблицу, я бы использовал 'format'. – Svante

+0

Может кто-нибудь, кто понимает Perl, пожалуйста, измените название этого вопроса, чтобы быть более описательным? – Earlz

ответ

7

Мне не нравится вариант 2, поскольку это вносит ненужную особый случай.

Я бы реорганизовать из строительства оперативного суффикса:

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

    # Later... 

    $key .= $suffix ; 
25

Я предпочел бы

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

или

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

вместо всего этих странных вещей.

Из sprintf документации:

Флаг символов

'-' Преобразованный значение должно быть оставлено Настройтесь на границе поля. (Значение по умолчанию - это правильное обоснование.) Преобразованное значение заполняется справа пробелами, а не слева с пробелами или нулями. A '-' переопределяет 0, если указаны оба значения.

Ширина поля

Необязательный десятичное число строк (с ненулевой первой цифры), задающая минимальную ширину поля. Если преобразованное значение имеет меньшее количество символов, чем ширина поля, оно будет дополнено пробелами слева (или справа, если установлен флаг левой настройки). Вместо строки десятичного разряда можно написать '*' или '*m$' (для некоторого десятичного целого m), чтобы указать, что ширина поля задается в следующем аргументе или в m-м аргументе, соответственно, который должен иметь тип int. Отрицательная ширина поля принимается за флаг '-', за которым следует положительная ширина поля. Ни в коем случае несущественная или малая ширина поля не вызывает усечения поля; если результат преобразования шире, чем ширина поля, поле расширяется, чтобы содержать результат преобразования.

+0

Было бы здорово, если бы вы могли добавить редактирование, объясняющее директивы sprintf для будущих поисковиков. Тем более, что это лучший подход. – insaner

+0

@Hynek -Pichi- Vychodil, Спасибо, что поделились этой мыслью. – Robie

1

Я выглядит немного странно, но это не работает (до сих пор):

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

Позвоните мне старой школы, но я хотел бы использовать Е() или Sprintf():

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

Это левое оправдывает строку $ key в 33 пробела, добавляет $ prompt и $ value и новую строку.Если бы я хотел, чтобы вычислить длину первой части динамически:

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

Поскольку это одна строка вместо 4 (вариант 1) вопрос или 6 (вариант 2), она набирает благоприятно по шкале краткость.

+0

Поскольку я задал вопрос о лучшей практике, мне сложно сейчас не согласиться с вашим ответом - с помощью printf код выглядит лучше, а my_print - выход. –

Смежные вопросы