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


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



4.18. Программа: words   145

В приведенном выше алгоритме Фишера—Йетса это смещение устраняется за счет изменения интервала выбираемых случайных чисел.

 Смотри также

Описание функции rand B.peilfunc(\). Дополнительная информация о случай­ных числах приведена в Рецептах 2.7-2.9. В рецепте 4.19 показан другой спо­соб построения случайных перестановок.

4.18. Программа: words

Описание

Вас когда-нибудь интересовало, каким образом программы типа Is строят столбцы отсортированных выходных данных, расположенных по столбцам, а не по строкам? Например:

aw k

cp

ed

login

mount

rmdir

sum

basename

csh

egrep

Is

mt

sed

sync

cat

date

fgrep

mail

mv

sh

tar

chgrp

dd

grep

mkdir

ps

sort

touch

chfflod

df

kill

mknod

pwd

stty

VI

chown

echo

In

more

rm

su

В примере 4.2

показано,

как это

делается.

Пример

4.2. words

#' /usr/bm/perl

-w

# words •

- вывод

данных по

столбцам

use strict,

my ($item, $cols, $rows, $maxlen), my (Sxpixel, Sypixel, $mask, @data),

getwinsize(),

#  Получить все строки входных данных

#  и запомнить максимальную длину строки
Smaxlen = 1,

while (о) { my $mylen, s/\s+$//,

Smaxlen = $mylen if (($mylen = length) > Smaxlen) push(@data, $_),

Smaxlen += 1,       # Дополнительный пробел

# Определить границы экрана $cols = int($cols / Smaxlen) || 1,

продолжение


146   Глава 4 • Массивы

Пример 4.2. (продолжение)

$rows = mt(($#data+$cols) / $cols),

#  Задать маску для ускорения вычислений
$mask = sprintf( %%-%ds , $maxlen-1),

#  Подпрограмма для обнаружения последнего элемента строки
sub EOL { ($item+1) % $cols == 0 }

й Обработать каждый элемент, выбирая нужный фрагмент

ft на основании позиции

for (Sitem = 0, $item < $rows * $cols, $item++) {

my Starget = ($itera % $cols) ¦ $rows + int($item/$cols)

my $piece = spnntf($mask $target < ©data ? $data[$target]   ),




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