PERL: БИБЛИОТЕКА ПРОГРАММИСТА


PERL: БИБЛИОТЕКА ПРОГРАММИСТА - стр. 144


Ipiece =~ s/\s+$// if EOL(), # Последний элемент не выравнивать

print $piece,

print \n if EOL(),

#  Завершить при необходимости
print \n if EOL(),

#  He переносится -- только для Linux
sub getwmsize <

my Swinsize = \0 x 8,

my STIOCGWINSZ = 0x40087468,

if (ioctl(STDOUT, STIOCGWINSZ, Swinsize)) {

($rows, $cols, Sxpixel, Sypixel) = unpack( S4 , Swinsize), } else {

$cols = 80,

Наиболее очевидный способ вывести отсортированный список по столбцам — последовательно выводите каждый элемент списка, выравнивая его пробелами до определенной ширины. Когда вывод достигает конца строки, происходит пе­реход на следующую строку. Но такой вариант хорош лишь тогда, когда строки читаются слева направо. Если данные должны читаться по столбцам, сверху вниз, приходится искать другое решение.

Программа words представляет собой фильтр, который генерирует выходные дан­ные по столбцам. Она читает все входные данные и запоминает максимальную длину строки. После того как все данные будут прочитаны, ширина экрана делится на длину самой большой входной записи — результат равен ожидаемому количеству столбцов.

Затем программа входит в цикл, который выполняется для каждой входной записи. Однако порядок вывода неочевиден. Предположим, имеется список из девяти элементов:

Неправильно        Правильно

12 3 14 7 4 5 6 2 5 8 7 8 9       3 6 9


4.19. Программа: permute   147

Программа words производит все необходимые вычисления, чтобы элементы (1,4,7) выводились в одной строке, (2,5,8) — в другой и (3,6,9) — в последней строке.

Текущие размеры окна определяются вызовом loctl. Этот вариант прекрас­но работает — в той системе, для которой он был написан. В любой другой он не подойдет. Если вас это устраивает, хорошо В рецепте 12.14 показано, как опре­делить размер окна в вашей системе с помощью файла ioctl.pch или программы на С. Решение из рецепта 15.4 отличается большей переносимостью, однако вам придется установить модуль с CPAN.

> Смотри также---------------------------------------------------------------------------------------------




- Начало -  - Назад -  - Вперед -