Как я могу дополнить часть строки пробелами в Perl? - PullRequest
12 голосов
/ 21 марта 2010

Какую версию вы предпочитаете?

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

Ответы [ 4 ]

29 голосов
/ 21 марта 2010

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

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

или

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

вместо всего этого странного материала.

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

Знаки символов

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

Ширина поля

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

8 голосов
/ 21 марта 2010

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

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

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

    # Later...

    $key .= $suffix ;
5 голосов
/ 21 марта 2010

Назовите меня старой школой, но я бы использовал printf () или 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), он получает положительную оценку по шкале краткости.

1 голос
/ 21 марта 2010

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

#!/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 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...