Книги
чёрным по белому
Главное меню
Главная О нас Добавить материал Поиск по сайту Карта книг Карта сайта
Книги
Археология Архитектура Бизнес Биология Ветеринария Военная промышленность География Геология Гороскоп Дизайн Журналы Инженерия Информационные ресурсы Искусство История Компьютерная литература Криптология Кулинария Культура Лингвистика Математика Медицина Менеджмент Металлургия Минералогия Музыка Научная литература Нумизматика Образование Охота Педагогика Политика Промышленные производства Психология Путеводители Религия Рыбалка Садоводство Саморазвитие Семиотика Социология Спорт Столярное дело Строительство Техника Туризм Фантастика Физика Футурология Химия Художественная литература Экология Экономика Электроника Энергетика Этика Юриспруденция
Новые книги
Цуканов Б.И. "Время в психике человека" (Медицина)

Суворов С. "Танк Т-64. Первенец танков 2-го поколения " (Военная промышленность)

Нестеров В.А. "Основы проэктирования ракет класса воздух- воздух и авиационных катапульных установок для них" (Военная промышленность)

Фогль Б. "101 вопрос, который задала бы ваша кошка своему ветеринару если бы умела говорить" (Ветеринария)

Яблоков Н.П. "Криминалистика" (Юриспруденция)
Реклама

Изучаем Perl - Шварц Р.

Шварц Р., Кристиансен Т. Изучаем Perl — Москва, 2002. — 324 c.
Скачать (прямая ссылка): izuchaemperl2002.djvu
Предыдущая << 1 .. 100 101 102 103 104 105 < 106 > 107 108 109 110 111 112 .. 124 >> Следующая

print "The value for $some__strmg is $map { $some_string}\n";
Первая строка создает хеш из требуемых пар ключ-значение. Вторая строка
выбирает строку, удаляя символ новой строки. Третья строка выводит на
экран введенную строку и соответствующее ей значение.
Этот хеш можно создать и с помощью серии отдельных операций присваивания:
$map('red'} = 'apple';
$map('green') = 'leaves';
$map('blue') = 'ocean';
266
Научаем Perl
2. Вот один из способов решения этой задачи:
chomp(@words = <STDIN>); # читать слова минус символы новой
строки
foreach $word (Swords) {
$count{$word) = $count{$word) + 1; # или $count($word)++
>
foreach $word (keys %count) {
print "$word was seen $count{$word) times\n";
}
Первая строка считывает строки в массив 0words. Вспомните: в результате
выполнения этой операции каждая строка становится отдельным элементом
массива, причем символ новой строки останется нетронутым.
В следующих четырех строках осуществляется обход массива, при этом $word
приравнивается по очереди каждой строке. Функция chomp отсекает символ
новой строки, а потом начинается волшебство. Каждое слово используется
как ключ хеша. Значение элемента, выбранного по этому ключу (слову),
представляет собой значение счетчика повторений данного слова до текущего
момента. Сначала в хеше элементов нет, поэтому если слово wild
встречается в первой строке, то $count {"wild"} будет содержать undef.
Это значение undef плюс единица оказывается равным нулю плюс единица, то
есть единице. (Напомним, что при использовании в качестве числа undef
означает нуль.) При следующем проходе у нас будет единица плюс единица,
или два, и т.д.
Другой распространенный способ задания этой операции инкрементирования
приведен в комментарии. Опытные Perl-программисты обычно отличаются
леностью (мы называем это "краткостью") и никогда не пишут одну и ту же
ссылку на хеш в обеих частях операции присваивания, если можно обойтись
автоинкрементированием.
После подсчета слов в последних нескольких строках программы
осуществляется просмотр хеша и поочередное получение всех его ключей.
После вычисления строкового значения сам ключ и соответствующее ему
значение выводятся на экран.
Есть и другое решение, отличающееся от описанного только тем, что перед
словом keys в третьей с конца строке вставлена операция sort. Без
проведения операции сортировки выводимый результат кажется случайным и
непредсказуемым. После сортировки все упорядочивается и становится
предсказуемым. (Лично я редко использую операцию keys без сортировки; при
наличии операции sort непосредственно перед keys повторные просмотры
одних и тех же или похожих данных дают сопоставимые результаты.)
Приложение А. Ответы к упражнениям
267
Глава 6 "Базовые средства ввода-вывода"
1. Вот один из способов решения этой задачи:
print reverse <>;
Вас, может быть, удивит краткость этого ответа, но он, тем не менее,
верен. Вот как работает этот механизм:
а) Сначала функция reverse ищет список своих аргументов. Это значит,
что операция "ромб" (<>) выполняется в списочном контексте.
Следовательно, все строки файлов, указанных как аргументы командной
строки (или данные, поступающие со стандартного ввода, если аргументов
нет), считываются и преобразуются в список, каждый элемент которого
состоит из одной строки.
б) Затем функция reverse меняет порядок следования элементов списка на
обратный.
в) Наконец, функция print получает список-результат и выводит его
2. Вот один из способов решения этой задачи:
print "List of strings:\n"; chomp(^strings = <STDIN>); foreach (^strings)
{
printf "%20s\n", $_;
}
Первая строка приглашает ввести список строк.
Следующая строка считывает все строки в один массив и избавляется от
символов новой строки.
В цикле foreach осуществляется проход по этому массиву с присвоением
переменной $_ значения каждой строки.
Функция printf получает два аргумента. Первый аргумент определяет формат
"%20s\n", который означает 20-символьный столбец с выравниванием справа и
символ новой строки.
3 Вот один из способов решения этой задачи:
print "Field width: chomp(Swidth = <STDIN>); print "List of strings:\n";
chomp (Sstrmgs = <STDIN>) ; foreach (Sstrmgs) {
printf "%${width}s\n", $_;
}
В решение, данное к предыдущей задаче, мы добавили приглашение ввести
ширину поля и ответ на него.
268
Изучаем Perl
Есть еще одно изменение: строка формата printf теперь содержит ссылку на
переменную. Значение переменной $width включается в эту строку до того,
как printf использует данный формат. Отметим, что мы не можем записать
эту строку как
printf "%$widths\n", $_; #WRONG
потому что тогда Perl искал бы переменную с именем $widths, а не
переменную с именем $width, к которой мы прибавляем букву s. По-другому
это можно записать так:
printf "%$width"."s\n", $_; # RIGHT
потому что символ конца строки завершает также имя переменной, защищая
следующий символ от присоединения к имени.
Глава 7 "Регулярные выражения"
Предыдущая << 1 .. 100 101 102 103 104 105 < 106 > 107 108 109 110 111 112 .. 124 >> Следующая