Как я могу отформатировать столбцы без использования формата Perl? - PullRequest
2 голосов
/ 13 ноября 2009

Часто в Perl я хочу распечатать данные столбца / строки, скажем, из хеша.

Это просто:

foreach my $k(keys %h)
{
  print $k, "\t", $h{$k}, "\n";
}

Однако, если длина ключа варьируется , тогда форматирование выглядит просто очень неровно. Я исследовал формат , и он, как правило, слишком тяжелый для того, что я ищу, который представляет собой «простой» выравниватель строк и довольно симпатичный принтер.

Ответы [ 6 ]

16 голосов
/ 13 ноября 2009

Я думаю, вы найдете printf полезным. Вот небольшой пример:

printf("%10s\t%10s\n", $k, $h{$k});
## prints "         key\t         value\n"
## prints "  longer_key\t  longer_value\n"

Длинные значения не усекаются, и вы можете изменить текстовую привязку внутри блока:

  • %10s - означает тип строки длиной 10 (по левому краю)
  • %-10s - означает тип строки длиной 10 (по правому краю)

Полный список форматов находится на sprintf справочной странице .

7 голосов
/ 13 ноября 2009

Проверьте оператор x (задокументированный в perldoc perlop ), полезный для простых задач форматирования, которые включают поля заполнения определенной длины:

while ((my $key, $value) = each %h)
{
    print $key . (" " x (20 - length $key)) . $value, "\n";
}

Вы также можете использовать sprintf или printf ( perldoc -f sprintf , perldoc -f printf ) (при этом вы также можете дополнять нулями в числах):

while ((my $key, $value) = each %h)
{
    printf("%20s %20s\n", $key, $value);
}
6 голосов
/ 13 ноября 2009

Надежное решение требует двух проходов: один для определения длины самого длинного ключа, другой для печати вывода:

my $l = 0;
foreach my $key (keys %hash) {
    $l = length($key) if length($key) > $l;
}

foreach my $key (keys %hash) {
    printf "%-${l}s  %s\n", $key, $hash{$key};
}

Если вы заранее знаете верхний предел длины клавиш, вы можете избежать первого цикла.

5 голосов
/ 13 ноября 2009

Если вы хотите сверхмощное решение, есть такие модули, как Text :: Table .

3 голосов
/ 13 ноября 2009

Возможно, это не оптимальное решение, но вам нужно найти максимальный ключ и максимальную длину значений, а затем передать их в sprintf или pack. Или вы можете использовать статическую максимальную длину, если ваш источник данных имеет «разумные» ограничения (например, ограничения длины столбца в базе данных и т. Д.)

1 голос
/ 13 ноября 2009

Я знаю, вы сказали, что формат может быть слишком тяжелым, но на самом деле он может быть менее сложным. Попробуйте что-то вроде этого:

foreach my $k(keys %h) {
  format =
  Key:  @<<<<<<<<<<<<<<<< Value:  @>>>>>>>>>>>>>>>>>
  $k,                     $h{$k}  
  .

  write;
}

Надеюсь, это поможет !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...