Однострочник месяца на Perl: апрель -- жесточайший месяц
Автор: Ben Okopnik
Перевод: Павел Соколов


-- Ты знаешь, Фринк, -- сказал Вумерт, развалившись на залитом солнцем шезлонге, -- апрель -- не самое плохое время в году. -- Он глотнул апельсинового сока, который был несколькими мгновениями до этого выжат из поздних "флоридских ананасовых" апельсинов, и удовлетворённо вздохнул. -- Некоторые люди жалуются на переменчивую погоду и необходимость заполнения налоговых деклараций, но...

-- Дело не в этом. -- проворчал Фринк. Определённо, он был на стороне тех, кто жалуется, несмотря на стоящую перед ним тарелку дымящихся великолепно выглядящих и пахнущих пирогов с луговым медом. Ему надо было подготовить домашнее задание к следующему дню и он чувствовал себя раздражённым. -- Это всё эти дурацкие шутки и розыгрыши. Я всё время чувствую себя как на иголках и мне приходится следить за всеми. Апрель, эх! Не могу дождаться, когда он кончится.

Вумерт приподнял брови, но ничего не ответил. Дотянувшись до стойки, он взял КПК и набрал несколько команд.

-- Я думал о новом JAPH [1] для себя, и только что родил вот это. Что ты думаешь?

Он направил iPAQ с запущенным Линукс на десктоп Фринка и активировал инфракрасный передатчик. Код появился на десктопе практически сразу.


{$/=q**}map{print+chr(y*(*(**$]*2+y*)*)*)}split/\./=><DATA> __END__ J -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*- P u -*-*-*-*-*-*-*- (((((())))).(((( -*-*-*-*-*-*-*- e s -*-*-*-*-*-*-*- ((((((()).(((((( -*-*-*-*-*-*-*- r t -*-*-*-*-*-*-*- ((((()))).(((((( -*-*-*-*-*-*-*- l a -*-*-*-*-*-*-*- (((())))).(((((( -*-*-*-*-*-*-*- h n -*-*-*-*-*-*-*- (((()))))))).((( -*-*-*-*-*-*-*- a o -*-*-*-*-*-*-*- )).(((((((.((((( -*-*-*-*-*-*-*- c t -*-*-*-*-*-*-*- (((((().(((((((( -*-*-*-*-*-*-*- k h -*-*-*-*-*-*-*- ((().(((((((((() -*-*-*-*-*-*-*- e e -*-*-*-*-*-*-*- ))))))).((())).( -*-*-*-*-*-*-*- r r -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*- ,
(Примечание автора: попробуйте запустить скрипт (его можно скачать в виде текстового файла), чтобы получить понятие о том, что происходит.)

-- Это... интересно, Вумерт, -- Фринк уставился в код, полностью потерявшись в первых нескольких символах. -- Извини, я не вижу смысла в этих вещах...в любом случае их сложно создать. Я пробовал много раз и

print "Just a Perl Hacker,"

кажется наиболее разумным вариантом.

В задумчивости он положил руки на клавиатуру. -- Чёрт, я никуда не попаду с этим заданием. Нас заставили выучить набор команд, необходимых для работы в сети. Я разобрался со всем, кроме последней задачи и чувствую, что больше не могу смотреть на них. Вумерт, что за "команда, которая выводит полное имя машины"? Я не могу придумать ни одной и, кстати, я думаю, что профессор здесь перегнул палку. Просто имя хоста -- это довольно просто: это моё приглашение в оболочке! Однако я не уверен, что может быть этим "полным именем"...

-- Довольно просто, -- Вумерт повернулся на другой бок, практически засыпая на тёплом весеннем солнышке. -- В Perl это может потребовать меньше нажатий на клавиши. Вот простой пример однострочника тебе на пробу:[2]


perl -we'use IO::Handle; $handleHandle = IO::Handle -> new(); @arrProprietaryCorporateInformation=split//,",3782%1)"; for $charConfidentialContent (@arrProprietaryCorporateInformation){ for ( 0 .. ord( $charConfidentialContent ) ){ $handleHandle->format_lines_per_page($_++); } push @arrIntermediateResults, chr $handleHandle->format_lines_per_page() + $=; } $strPreReleaseTemporaryBuffer = join "", @arrIntermediateResults; substr( $strPreReleaseTemporaryBuffer, 8 ) = "\040\055\055\146\161\144\156"; system "$strPreReleaseTemporaryBuffer";'

-- Или ты можешь упростить: [2]


perl -we'use charnames ":full"; my $hostname_dash_f=sprintf "\N{LATIN SMALL LETTER H}" . "\N{LATIN SMALL LETTER O}" . "\N{LATIN SMALL LETTER S}" . "\N{LATIN SMALL LETTER T}" . "\N{LATIN SMALL LETTER N}" . "\N{LATIN SMALL LETTER A}" . "\N{LATIN SMALL LETTER M}" . "\N{LATIN SMALL LETTER E}" . " -\N{LATIN SMALL LETTER F}"; $result_of_hostname_dash_f=`$hostname_dash_f`; printf "%-.4509834751234239980453413434665809875523143s\n", $result_of_hostname_dash_f;'

Фринк в испуге издал хныкающий звук, а затем неожиданно просветлел.

-- О! Возможно я смогу найти, если просто напечатаю "apropos hostname"!... ОК, вот она -- кажется, что команда называется "hostname". Ха. "man hostname" говорит, что ключи "-f" или "--fqdn" могут быть использованы, чтобы напечатать полное имя машины... Посмотрим:

frink@Aphrodite:~$ hostname -f
Aphrodite.Olympus

Он напечатал команду и сохранил результаты с очевидным удовлетворением.

-- Всё сделано! Это было просто. Вумерт, я удивлён, что ты не смог догадаться.

-- Да. Молодец, Фринк. Это было умно. Воспользовался стандартными командами Unix, кто бы мог подумать?... Теперь, когда ты закончил со своей домашней работой, переходи к занятиям Perl -- и не смотри так! Час хорошей работы и ты всё закончишь. Но до этого, передай, пожалуйста, ещё стаканчик этого апельсинового сока. Он довольно хорош, тебе стоит попробовать.

Как только Фринк пошёл на кухню, Вумерт выпрыгнул из кресла и отстучал очередь на клавиатуре:

x=`echo -e "\240"`;mkdir $x;echo "hostname -f">$x/perl;chmod +x $x/perl;export PATH=$x:$PATH;clear

Мгновение спустя он снова отдыхал на солнышке, само безделье, и, определённо, был слишком расслаблен, чтобы как-то двигаться в последний час. Фринк, вернувшись с соком, передал ему стакан.

-- Вообще-то, Вумерт, я ожидал, что ты из тех, кто любит разыгрывать других, особенно сегодня. Всё, что ты уже сделал, однако, довольно вяло. Должен сказать, что я несколько удивлён.

Вумерт с удовольствием потянулся, кивнул и встал. Подхватив лёгкую куртку он подошёл к двери и открыл её.

-- Что-то есть в том, что ты говоришь. Думаю, схожу к дому моего друга Нано Тек и посмотрю, в какую проблему мне удастся вляпаться. А, вот ещё что...

Фринк посмотрел на него из-за клавиатуры, где он только что собирался набрать первое задание по Perl.

-- Если ты не возражаешь, проверь кое-что для меня. Мне эта задача с "hostname" показалась интересной. Попробуй следующее:

perl -we'fqdn'

Фринк пожал плечами, определённо собираясь побыстрее начать свои занятия и добраться до их завершения.

-- Хорошо... А. Получилось. Почему ты не сказал мне этого раньше? Это встроенная функция Perl?... Однако она, кажется, зациклилась. Что бы я ни делал, она печатает одно и тоже. Что происходит, Вумерт?... Вумерт!

Звук захлопнувшейся входной двери стал единственным ответом.

Апрель был в самом разгаре.


[1] JAPH -- это ещё один способ баловаться с Perl, ставший известным благодаря Рандалу Шварцу (Randal Schwartz). Идея была написать какой-нибудь код на Perl (предпочтительно демонстрирующий какую-либо тонкость или механизм -- Рандал часто использовал JAPH, чтобы подчеркнуть то, что он объяснял в письме) и использовать его в качестве подписи для email. Когда она пишется в файл с помощью Perl shebang и выполняется (или запускается как скрипт из командной строки), код должен выводить строку "Just a Perl hacker,". Некоторые опускают последнюю запятую.

[2] Оба этих жутких монстра, конечно, представляют собой нормальный работающий код. :)

Бен -- сотрудничающий редактор Linux Gazette и член Банды ответчиков (в смысле, они отвечают на возникающие вопросы читателей. Прим. перев.)

Бен родился в Москве в 1962 г. В шесть лет заинтересовался электричеством -- продемонстрировав это, воткнув вилку в розетку и вызвав пожар. С тех пор неоднократно проваливался в технологические люки. Он начал работать с компьютерами ещё в старые, добрые времена, когда их приходилось собирать из деталей и припаивать на печатные платы, а программы должны были умещаться в 4k памяти. Он с радостью заплатил бы внушительную сумму любому психологу, способному излечить его от вызванных этим кошмаров.

Последующий опыт Бена включает создание программ практически на дюжине языков, поддержку сетей и баз данных во время приближающегося урагана, а также написание статей для публикаций в разных местах: от журналов по парусному спорту до техножурналов. Завершив недавно семилетний круиз по Атлантике/Карибскому морю под парусом, он на данный момент пришвартовался в Балтиморе, где работает техническим инструктором в Sun Microsystems.

Бен работает с Linux с 1997, и считает, что именно из-за него у Бена полностью пропал интерес к развязыванию атомной войны в разных частях северо-запада Тихого океана.


Copyright © 2003, Ben Okopnik. Copying license http://www.linuxgazette.com/copying.html
Published in Issue 89 of Linux Gazette, April 2003


Вернуться на главную страницу