Массивы и printf

В обычной ситуации массив не может использоваться как аргумент printf. Это объясняется тем, что массив может содержать любое количество элементов, а форматная строка работает с фиксированным числом элементов. Если форматная строка содержит три преобразования, элементов тоже должно быть три. Однако ничто не мешает вам построить форматную строку «на ходу», потому что она может быть любым выражением. Впрочем, сделать это правильно может быть нелегко, поэтому форматную строку удобно хранить в переменной (особенно во время отладки):

my @items = qw( wilma dino pebbles );
my $format = "The items are:\n" . ("%10s\n" x @items);
## print "the format is >>$format<<\n"; # Для отладки
printf $format, @items;

Оператор x дублирует заданную строку в @items экземплярах (переменная используется в скалярном контексте). В данном примере количество экземпляров равно 3, так как массив состоит из трех элементов. Построенная форматная строка получается такой, как если бы она с самого начала была записана в виде The items are:\n%10s\n%10s \n%10s\n. А в выходных данных каждый элемент печатается в отдельной строке и выравнивается по правому краю в столбце шириной 10 символов под строкой заголовка. Впечатляет, не правда ли? Но и это еще не все, поскольку строки можно объединить:

printf "The items are:\n".("%10s\n" x @items), @items;

Массив @items сначала используется в скалярном контексте для получения длины, а затем в списковом контексте для получения содержимого.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Perl на эту тему:
Аргументы вызова
Ввод данных оператором <>
Вывод функцией say
Закрытие файлового дескриптора
Запись данных в стандартный вывод

Вернуться в раздел: Perl / 4. Ввод и вывод