2009-11-13 2 views
2

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

Это просто:

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

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

ответ

16

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

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

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

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

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

3

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

7

Отъезд оператора 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); 
} 
5

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

6

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

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}; 
} 

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

+1

Список использования :: Util qw (max); my $ l = max (отображение {длина} ключей% hash); – Narveson

1

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

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

    write; 
} 

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

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