как централизованно оправдать в функции printf в Perl - PullRequest
5 голосов
/ 13 мая 2011

Я знаю, printf функция по умолчанию использует выравнивание по правому краю. - сделает это оправданным слева. Но возможно ли сделать его централизованно оправдывающим формат?

Большое спасибо.

Ответы [ 4 ]

5 голосов
/ 13 мая 2011
my @lines = (
  "It is true that printf and sprintf",
  "do not have a conversion to center-justify text.",
  "However, you can achieve the same effect",
  "by padding left-justified text",
  "with an appropriate number of spaces."
);

my $max_length = 0;
foreach my $line (@lines) {
  $max_length = (length $line > $max_length) ? length $line : $max_length;
}

foreach my $line (@lines) {
  printf "%s%-${max_length}s\n", ' ' x int(($max_length - length $line)/2), $line;
}
5 голосов
/ 13 мая 2011

Функция printf не может центрировать текст.

Однако существует очень старый и почти забытый механизм, который может это сделать.Вы можете создать формат операторов в Perl, который говорит написать операторов, как печатать.Используя форматирование и запись, вы можете центрировать текст выравнивания по центру.

Это было что-то вроде того, что было сделано еще во времена Perl 3.x в 1989 году, но к моменту выхода Perl 4 оно было заброшено.Perl 5, с его более сильной областью видимости переменных, действительно затрудняет использование форматов, поскольку их использование нарушит то, как Perl 5 нравится область видимости переменных (форматы являются глобальными по своей природе).

Вы можете узнать больше об этомглядя на perldoc perlform.Я не видел их в течение многих лет.

4 голосов
/ 02 ноября 2011

Вам нужно использовать две переменные для каждого значения, которое вы хотите напечатать, и динамически устанавливать ширину каждого вокруг ширины значения.Проблема становится немного сложнее, если вы хотите иметь одинаковую общую ширину, когда ваше значение имеет нечетную / четную длину строки.Следующее, кажется, делает трюк!

use POSIX; 
printf( "<%*s%*s>\n", 
   ((10+length($_))/2), $_, 
   ceil((10-length($_))/2), "" ) 
      for( qw( four five5 six666 7seven7 ) );

который печатает

<   four   >
<  five5   >
<  six666  >
< 7seven7  >
2 голосов
/ 13 мая 2011

Вам нужно знать line width для этого. Например, печать центрированных линий на терминал:

perl -lne 'BEGIN{$cols=`tput cols`} print " " x (($cols-length)/2),$_;' /etc/passwd

редактировать: это происходит, когда вы не читаете вопрос полностью. ; (Ofc, это , а не и printf тег форматирования.

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