04-05-2008 16:03
![]() |
В этой главе рассматриваются:
|
munge (мунж) 1. [унизительное] Неполноценное преобразование информации.
2. Переписывание "с-нуля" подпрограммы, структуры данных,
или даже целой программы.
3. Изменение информации так, как будто-то говорящему дела
нет до сути того, о чем он говорит, и он говорит-говорит-говорит...
или как будто нет возможности описать ответ кратко (чем-то похоже на
мямленье или бормотанье)
The Jargon File <http://www.tuxedo.org/~esr/jargon/html/entry/munge.html>
Обработка данных (data munging) это все то, что связано с получением данных в одном формате и преобразованием их в другой. Возможно вы слышали этот термин, когда некто говорил о том, что над данными необходимо выполнить некоторые действия, но какие, он тогда точно еще не знал.
Когда вы задумаетесь о смысле этого высказывания, то поймете, что это основополагающая часть того, чем каждодневно занимается большинство, а может быть даже все, из компьютерных систем. Примеры обработки данных включают в себя:
и вычисляет ежемесячную зарплату;
информацию, о динамике популяции;
таблицу чемпионов;
различными текстовыми форматами;
Говоря более конкретно, процесс обработки данных состоит из некоторого количества процессов, которые применяются к изначальному набору данных с тем, чтобы преобразовать его в другой, отличный от него, но взаимосвязанный с ним набор данных. Эти процессы попадают в одну из категорий: распознавание, грамматический разбор, фильтрация и преобразование (прим.перев.: recognition, parsing, filtering и transformation, соответственно).
Чтобы обсудить эти процессы, предположим, что имеется текстовый файл, содержащий описание моей коллекции компакт-дисков (CD). Для каждого CD указывается автор, название, звукозаписывающая фирма и год выпуска. Кроме того, файл содержит информацию о дате, когда данный файл был сформирован и количестве записей в этом файле. На рисунке 1.1 помечены различные части такого файла.
Каждая строка данных в файле (иначе говоря, информация об одном CD) называется ''записью данных (прим.перев.: data record''). Каждый отдельный элемент данных (например, название CD или год его выпуска) называется полем данных (прим.перев.: data field). Помимо записей и полей, файл данных может содержать дополнительную информацию, которая содержится в заголовках или подвалах (прим.перев.: header и footer, соответственно). В этом примере заголовок содержит описание данных, за которым следует строка заголовка, в которой содержится дате формирования файла данных, а далее строка, описывающая значение каждого отдельного поля данных. Подвал содержит информацию о количестве записей в файле. Данная информация может быть полезна для того, чтобы быть уверенным в том, что мы обработали (или даже может быть получили) весь файл целиком.

Мы будем возвращаться к этому примеру на продолжении всей книги для того, чтобы демонстрировать приемы обработки данных.
Вы не сможете сделать ничего полезного с данными до тех пор, пока не сможете распознать те данные, которые у вас есть в наличии. Распознавание данных это то, как вы исследуете источник данных и то, каким образом вы выделяете ту часть данных, которая вас интересует. Говоря более конкретно, это то, как компьютерная программа исследует ваш источник данных, сравнивая, с тем, что она ищет, используя определенные шаблоны, которые позволяют ей определить ту часть имеющихся данных, которая представляет интерес.
В нашем примере с CD достаточно много данных, и формат зачастую разнится, в зависимости от того, в какой части файла эти данные располагаются. В зависимости от того, что мы намереваемся делать дальше с данными, строки заголовка и подвала могут нас вовсе не интересовать. С другой стороны, если мы желаем составить отчет о том, что 16 сентября 1999 года я владел шестью компакт-дисками, то нас интересуют данные только лишь из записей заголовка и подвала, а настоящие записи, с их детальной информацией, нас абсолютно не волнуют.
Важной частью распознавания данных является осознание того контекста, в котором находятся интересующие нас данные. Например, элементы данных, которые составляют заголовок и подвал, будут обрабатываться совершенно по-другому, нежели элементы данных, которые составляют тело файла данных.
Следовательно, важно понимать, как выглядят наши входные данные и, что собственно мы собираемся с ними сделать.
Распознав те данные, которые Вам были нужны, требуется иметь возможность что-нибудь сделать с ними. Грамматический разбор данных занимается тем, что принимает ваши исходные данные и сохраняет их в таких структурах данных, которые будут как можно удобнее для того, чтобы использовать в оставшихся процессах.
К примеру, если мы выполняем грамматический разбор нашего CD-файл, то скорее всего мы будем хранить информацию о каждом CD в некой структуре данных. Каждый CD может быть элементом списковой структуры, а информация из заголовка и подвала, возможно, будет храниться в других переменных. Таким образом, грамматический разбор является процессом, который принимает текстовый файл и помещает полезные данные в переменные, которые доступны внутри нашей программы.
Вы хорошо представляете, что будете делать с данными дальше, так как именно это влияет на выбор вида структур данных.
На практике же, многие программы обработки данных написаны таким образом, что процессы распознавания и грамматического разбора объединены.
Вполне возможно, что ваш источник данных содержит слишком много информации. Иначе говоря вам может потребоваться уменьшить количество данных в наборе данных. Это можно сделать различными способами.
только те CD, исполнителем, на которых, является David Bowie или только CD, которые были выпущены в 90-ых годах.
исполнителя, название и год выпуска всех CD.
только лишь общее количество CD, для каждого исполнителя, или количество CD, выпущенное в каждом году.
число CD, исполнителем, на которых, является Billy Bragg.
Распознав, выполнив грамматический разбор, и отфильтровав наши данные, скорее всего, нам потребуется преобразовать их перед тем, как мы закончим разбираться с ними. Такая трансформация может принимать различные формы.
должен быть преобразован к другому виду, чтобы быть использованным, как идентификатор, в другом программном комплексе.
записи поля разделялись запятой, а в результирующей записи они должны разделяться с помощью символов табуляции.
имя исполнителя было более приемлимым для нас, а потому, потребуется преобразование из формата "фамилия, имя", в формат "имя, фамилия".
Как я уже говорил, обработка данных это то, с чем, в основном, имеют дело большинство компьютерных систем. Практически любая компьютерная задача может быть рассмотрена, как некоторая совокупность задач обработки данных. Двадцать лет назад, то есть до тех времен, когда всякий сотрудник заимел персональный компьютер на личном столе, компьютерный отдел предприятий назывался отделом Обработки Данных (прим.перев.: Data Processing department, у нас же это называлось ВЦ -- Вычислительный Центр), что вполне отражало его главную задачу -- он обрабатывал данные. Теперь, конечно же, мы имеем дело скорее всего с отделами Информационных Систем или Информационных Технологий (прим.перев.: Information Systems или Information Technology department), и их основная задача состоит в основном в том, чтобы наши персональные компьютеры были в работоспособном состоянии, а вовсе не в обработке данных. Таким образом всего-то навсего случилось лишь то, что обработка данных теперь производится каждым сотрудником, вместо небольшой группы компьютерных программистов и операторов.
Большие компьютерные системы все еще существуют. Не так много крупных организаций используют систему расчета заработной платы, которая работает на персональном компьютере, -- большинство же компаний имеют как минимум одну систему управления базами данных (прим.перев.: database system, далее СУБД), которая содержит детальную информацию о клиентах, изделиях, поставщиках и служащих. Наиболее общей задачей большинства офисных работников является ввод данных в такие корпоративные хранилища данных, либо извлечение данных из них. Чаще всего данные, которые загружаются в такие системы поступают либо в виде электронной таблицы (прим.перев.: spreadsheet), либо в виде текстового файла с разделителями (прим.перев.: comma-separated text file). Извлеченные данные, зачастую, поступают в другую электронную таблицу, где они затем преобразуются в таблицы данных, либо в графики.
Совершенно очевидно, для любого предприятия, что удобнее всего, когда данные хранятся в одном формате в одном месте. Каждый раз, когда вы дублируете элемент данных, увеличивается вероятность того, что эти две копии могут начать разниться одна от другой. Каждый проектировщик баз данных, всегда проходит через такую часть проекта, как процесс нормализации, который гарантирует то, что данные хранятся наиболее возможным эффективным способом.
Столь же очевидно, что если данные хранятся только лишь в одном формате, то этот формат вряд ли будет приемлем для всех остальных систем, которым потребуется доступ к таким данным. И хотя этот формат может быть не очень удобен для любой другой конкретной системы, он должен быть выбран таким образом, чтобы обеспечить максимальную гибкость и легкость в обработке, что, в свою очередь, упростит его преобразование в другие форматы. Чтобы быть полезным для всех тех людей, которые пожелают воспользоваться этими данными, он должен быть преобразован различными способами при передаче из одной системы в другую.
Вот тут-то и появляется обработка данных. Она обитает в промежутке между компьютерными системами, гарантируя, что данные, сформированные в одной системе, могут быть использованы в другой.
Давайте рассмотрим несколько простых примеров того, где может быть использована обработка данных. Эти примеры являются упрощенными бухгалтерскими задачами, которые я выполнял для крупных инвестиционных банков Лондона.
В первом из этих примеров, банк рассматривает возможность приобретения бухгалтерских данных у некоторой компании для того, чтобы передать их в отдел акционных исследований (прим.перев.: equity research department -- не уверен, что перевел правильно). В любом крупном банке такой отдел состоит из большого количества сотрудников, которые выполняют построения сложных финансовых моделей эффективности компании, с тем, чтобы попытаться предсказать будущую ее эффективность, и, тем самым, выяснить будущий курс акций. И тогда они могут рекомендовать стать пайщиками своим клиентам, и, возможно, несколько обогатиться в ходе этого процесса.
В частности, данный банк нуждался в дополнительной информации, причем данная информация должна содержаться в их собственной базе бухгалтерских данных. Имеется достаточно много компаний, которые предоставляют такие данные в электронном виде, а также короткий список из трех предприятий, которые обмениваются друг с другом информацией, обрабатывают и приводят ее к некоторому упрощенному набору данных. Моей задачей было загрузить эти три набора данных в существующую базу данных.
Эти три набора данных поступали в различных форматах. Поэтому я решил разработать некий канонический файловый формат, а затем написать Perl-скрипт, который бы загрузил такой формат в базу данных. Затем я написал три других Perl-скрипта (по одному на каждый из трех форматов), который считывал различные входные файлы и формировал файл в моем стандартном формате. В этом примере я считывал информацию из нескольких источников, а записывал в одно место.
Во втором примере я работал над торговой системой, которой потребовалось передавать детали торгов в различные другие системы. И снова, данные хранились в реляционной базе данных. В данном случае банк упростил все операции обмена меж системами, разработав для этих целей специальный файловый формат на основе XML (определение файлового формата XML, известного как Document Type Definition (DTD), будет приведено в Главе 10). Таким образом, все, что нам остается, это извлечь наши данные, создать необходимый XML-файл и отправить его в ту систему, которая в нем нуждается. Определением стандартного формата данных банк гарантирует, что всякая из его систем, всего-то навсего, должна уметь считывать или формировать один и тот же тип файлов, что в свою очередь экономит время на разработке.
Как мы увидели в предыдущем разделе, цель обработки данных состоит в получении данных в одном формате, выполнении различных преобразований над ними, и выдаче их в другом формате. Давайте более пристально рассмотрим то, откуда поступают данные и куда они затем могут передаваться.
Сначала немного терминологии. То место, в котором вы получаете данные называется источником данных (прим.перев.: data source). Место куда вы отправляете данные называется вашим приемником данных (прим.перев.: data sink).
Источники и приемники данных могут принимать различные формы. Вот некоторые из наиболее общих, с которыми Вам скорее всего придется столкнуться:
Рассмотрим эти источники и приемники данных более детально.
Наверное наиболее общим способом передачи данных меж системами является файл. Некое приложение пишет в файл. Этот файл затем пересылается в то место, где его подберет процесс обработки данных. Ваш процесс откроет файл, считает из него данные, и сформирует новый файл, содержащий преобразованные данные. Этот новый файл далее где-то будет использован, в качестве входного, для другого приложения.
Файлы данных используются по той причине, что они являются, своего рода, наименьшим общим делителем меж компьютерными системами. Совершенно верно так же и то, что каждая компьютерная система имеет понятие дискового файла. И хотя конкретный формат файла разнится от одной системы к другой (даже текстовый ASCII-файл имеет небольшие отличия в UNIX и Windows), но, в конце концов, его обработка и будет являться вашей работой.
Передача данных меж различными системами также обычно весьма простое дело. Многие компьютерные системы имеют реализацию File Transfer Protocol (FTP), который может быть использован для копирования файлов меж двумя, объединенными в сеть, системами. Более сложным вариантом является протокол Network File System (NFS), при котором файловые системы одного компьютера могут быть использованы совершенно так же, как локальные файловые системы на другом компьютере. Другим, таким же общим, методом передачи файлов является использование съемных носителей (CD-ROM'ы, дискеты, магнитные ленты) или даже MIME-вложения в email-сообщения.
Когда мы имеем дело с передачей файлов, перед нами встает такая важная проблема, которую необходимо преодолеть, как уверенность в том, что формирование файла завершено. Вы можете запустить процесс, который будучи запущенным в некой системе, будет отслеживать ту файловую систему, на которую должен поступить ваш отправляемый файл. В большинстве операционных систем файл появится тут же, как только процесс, производящий его, начнет запись в него. Ваш процесс не должен начинать чтение из файла до тех пор, пока он не будет полностью передан. В некоторых случаях разработчики пишут сложные системы, которые отслеживают размер файла, и запускают читающий процесс только лишь в том случае, когда файл прекратит увеличиваться в объеме. Другое, наиболее общее, решение состоит в записи еще одного небольшого флагового файла в момент, когда передача основного файла будет завершена, читающий же процесс постоянно проверяет наличие флагового файла. В большинстве же случаев лучшим является куда более простое решение -- просто-напросто формировать файл под другим именем, и переименовать его в ожидаемое имя только тогда, когда процесс передачи будет завершен.
Файлы данных удобны в тех случаях, когда имеются некие дискретные наборы данных, которые необходимо обработать за "один раз". Это может быть подведение итога банковских транзакций, отосланных учетной системе в конце дня. В случае, когда имеет место быть постоянный поток данных, более приемлемым может оказаться один из методов, обсуждаемых ниже.
Базы данных становятся более употребимыми нежели файлы данных. Термин "база данных" разными людьми трактуется весьма разнообразно. Те люди, которые используют в своей работе Windows-окружение могут понимать под этим термином dBase или другую сходную нереляционную СУБД. Пользователи UNIX-систем могут воспринимать этот термин как совокупность DBM-файлов. К счастью, большинство людей данный термин воспринимают как реляционную базу данных (прим.перев.: relational database management system (RDBMS)), будь то однопользовательский продукт по типу Microsoft Access или Sybase Adaptive Server Anywhere, либо истинно многопользовательский продукт, такой как Oracle или Sybase Adaptive Server Enterprise.
Базы данных имеют преимущество перед файлами данных в том, что они навязывают структуру вашим данным. Разработчик базы данных определяет схему базы данных (прим.перев.: ''database schema''), которая определяет форму и тип всех объектов ваших данных. Например, он в точности определяет в базе данных, какие элементы данных хранятся по каждому покупателю, какие из них являются опциональными, а которые обязательными. Многие СУБД позволяют вам определить взаимосвязи (прим.перев.: relationships или relations) меж объектами данных (например, "каждый счет должен содержать идентификатор покупателя, который в свою очередь соотносится с существующим покупателем"). Кроме того, современные СУБД также поддерживают исполняемый код, который может помочь реализовать некоторую бизнес-логику (например, "когда статус заказа изменится на 'доставлено', то автоматически выписать счет, соотносящийся с данным заказом").
Конечно же за все эти преимущества приходится платить. Выполнение действий над данными в СУБД потенциально медленнее, чем равнозначные операции над файлами данных. Кроме того, скорее всего вам потребуются дополнительные капиталовложения в современное аппаратное обеспечение, так как некоторые мощные СУБД обожают иметь в собственном распоряжении личный процессор (или даже процессоры). И тем не менее, большинство предприятий готовы платить такую цену за дополнительную гибкость в том, что они получают от таких СУБД.
Большинство современных СУБД используют диалект Structured Query Language (SQL) для всевозможных операций над данными. Таким образом, если Ваш источник или приемник данных является реляционной СУБД, то скорее всего вы будете взаимодействовать с ним используя SQL. СУБД от каждого из производителей имеет свой собственный проприетарный (патентованный) интерфейс, для передачи SQL-запросов в базу данных и обратного получения данных в вашу программу, однако на данный момент Perl имеет, независимый от производителя, интерфейс к базам данных (называемый DBI), который делает процесс переключения меж различными базами данных весьма простым и прозрачным (это истинно, конечно же до тех пор, пока вы не используете проприетарные особенности СУБД).
Если вам требуется непрерывно отслеживать данные, которые порождаются некоторой системой, а затем преобразовывать их таким образом, чтобы они могли быть использованы другой системой (например, системой, которая отслеживает реальном режиме времени отслеживает котировку акций), то вы должны обратить внимание на использование программных каналов (прим.перев.: data pipes). В такой системе приложение записывает данные непосредственно на поток стандартного ввода (прим.перев.: standard input) вашей программы. Ваша программа должна читать данные с ее стандартного потока ввода, преобразуя их (выполняя над ними обработку данных и записывая их куда-либо), а затем снова приступая к считыванию очередной порции данных. Кроме того, Вы можете также создать программный канал (или продолжить использовать уже существующий), записывая обработанные данные в Ваш стандартный поток вывода (прим.перев.: standard output), надеясь на то, что следующий в цепочке программных каналов, выберет их из него.
Детальнее эту концепцию мы рассмотрим, когда будем обсуждать модель UNIX-фильтра (прим.перев.: UNIX "filter") в главе 2.
Имеются и другие типы источников и приемников. Здесь мы приведем несколько больше вариантов таких источников и приемников, чем вам может попасться на практике. В каждом из таких примеров мы будем говорить о получении данных из источника, однако же данная концепция может быть в равной степени применима и к передаче данных в приемник.
функциональная возможность большинства UNIX-подобных операционных систем. Первый процесс подготавливается к записи данных в именованный программный канал, который для других процессов выглядит точно так же, как файл. Пишущий процесс ожидает, пока другой процесс пытается читать из такого файла. Затем, он записывает очередную порцию данных в именованный программный канал, которая в свою очередь, для читающего процесса, выглядит как содержимое файла. Такой вариант удобен, когда читающий процесс спроектирован так, что ожидает файл, однако ваша потребность состоит в том, чтобы передавать постоянно изменяющиеся данные.
компьютерами, которые находятся в одной сети (прим.перев.: network). (Здесь имеется в виду термин "сеть" в достаточно широком его смысле. Большинство Internet-протоколов основываются на TCP/IP, таким образом когда ваш модем дозванивается до вашего провайдера, то тем самым ваш персональный компьютер подключается к той же самой сети, что и web-сервер, с которого вы загружаете MP3-файлы.) Две системы определяют номер порта TCP/IP, посредством которого они будут взаимодействовать. Процесс обработки данных объявляет себя TCP/IP-сервером и прослушивает запросы на соединение, на указанном выше порту. Когда данные источника начинают передаваться, он порождает соединение на данном порту. При этом, имеют место быть, некоторого рода (определенные логикой приложения) квитирующие данные (прим.перев.: handshaking), за которыми следует передача данных от источника, ожидающему их, серверу-приемнику.
однако он настолько важен, что стоит обсудить его отдельно. Этот способ ныне становится все более общим. Если обе программы имеют доступ к Internet, то они могут располагаться на разных концах земного шара, и все же иметь возможность общаться друг с другом. Источник просто-напросто пишет данные в файл в некое общедоступное место в Internet. Программа обработки данных, используя HTTP, выставляет запрос на данный файл к web-серверу источника, а web-сервер в ответ отправляет файл. Файл может являться как HTML-файлом, так и в любом другом формате. HTTP может также иметь некоторые встроенные простейшие возможности по авторизации доступа (прим.перев.: basic authentication facilities), поэтому возможность защитить файлы, к которым Вы не желаете предоставлять публичный доступ, вполне реализуема.
Данные могут проявляться в различных форматах. Позже, в данной книге, мы рассмотрим достаточно много различных форматов данных, однако на текущий момент мы сделаем краткий обзор наиболее популярных.
Несмотря на то, что окружающий нас мир демонстрирует засилье неструктурированных данных, такой вариант вряд ли будет встречаться вам достаточно часто, так как суть обработки данных состоит в том, чтобы преобразовывать данные из одной структуры в другую. Компьютерной программе достаточно трудно применить некую структуру над данными, которые еще не были структурированы некоторым образом ранее. Вне сомнения, наиболее общим случаем задачи обработки данных является прием данных, с неявно выраженной структурой, и приведение их к некоторой другой структуре, которая скрыта где-то глубоко внутри них.
Лучшим примером неструктурированных данных является обычный текст. Другого варианта, как разбиение текста на отдельные строки и слова, для дальнейшего статистического расчета, трудно и представить.
И несмотря на все это, мы все таки рассмотрим неструктурированные данные в главе 5. Это будет сделано по большей части потому, что даст нам возможность обсудить некоторые наиболее общие принципы, такие как чтение и запись файлов, перед тем, как заняться их приведением к более структурированному виду.
Наиболее простым случаем данных, с которым вам придется столкнуться, являются запись-ориентированные данные. Источник такого рода будет состоять из определенного количества записей, каждая из которых может быть обработана отдельно от других. Записи могут отделяться друг от друга различными способами. Наиболее общий случай состоит в том, чтобы каждая строка в текстовом файле представляла собой отдельную запись, (хотя, конечно же, возможна некоторого рода путаница, когда речь идет о том, что собой представляет строка, однако об этом мы поговорим чуть позже), хотя в качестве разделителя может выступать либо пустая строка, либо предопределенная последовательность символов.
В рамках каждой записи, могут существовать некоторые поля, которые будут представлять различные элементы данных нашей записи. Они также могут быть определены различными способами. Это может быть и определенный символ-разделитель (зачастую запятая, либо знак табуляции), либо другой вариант, в котором запись может быть дополнена пробелами или нулями, для того, чтобы всегда иметь жестко заданное количество символов.
Запись-ориентированные данные мы будем рассматривать в главе 6.
Потребность в данных, в формате такого рода, проявилась совсем недавно. Лучшим примером иерархических данных может служить Standardized General Mark-up Language (SGML), его наиболее знаменитый потомок Hypertext Mark-up Language (HTML), а также Extensible Mark-up Language (XML). В использовании форматов такого рода, каждый элемент данных окружается определенными "тегами" или, иначе говоря, ярлыками (прим.перев.: tag), которые определяют его положение в общей иерархии данных. Элемент данных содержится внутри его предка, и может содержать своих собственных потомков. (Данная метафора семьи, конечно же, может быть и продолжена. Два узла, которые имеют одного родителя, могут быть названы ''узлами-братьями (прим.перев.: siblings nodes)'', хотя я никогда не слышал упоминаний о двух узлах с одним дедушкой, или бабушкой, т.е. о узлах-двоюродных-братьях (прим.перев.: cousins)). И вот в этот самый момент, мы уже не можем использовать метод обработки запись-за-один-раз (прим.перев.: record-at-a-time), который мы использовали над простейшими типами данных, и должны найти более мощный инструментарий.
Иерархические данные, в особенности HTML и XML, будут рассмотрены в главе 9 и 10.
И наконец, двоичные данные. Это такие данные, которые вы не можете использовать без программного обеспечения, которое было разработано специально для того, чтобы их обрабатывать. Не имея доступа к документации, объясняющей структуру двоичного файла данных, понять ее суть довольно затруднительно. Мы рассмотрим некоторые из наиболее популярных файловых форматов двоичных данных, и покажем каким образом можно получить из них наиболее значимые данные.
Двоичные данные будут рассмотрены в главе 7.
Perl это компьютерный язык программирования, использующийся с 1987 года. Изначально он был разработан для использования в операционной системе UNIX, однако позже он был перенесен на многие другие операционные системы, намного опережая по данному количеству другие языки программирования (за исключением быть может C).
Perl был разработан Larry Wall, чтобы решить определенную задачу, однако вместо того, чтобы написать нечто такое, что решало бы только данную задачу, Wall написал целый инструментарий, с помощью которого, позже, он смог решать и другие задачи.
И вот что из всего этого вышло, -- он привнес в мир наиболее мощный, из когда-либо разрабатываемых, инструментарий, по обработке данных.
От многих других компьютерных языков Perl отличает то, что Wall, при разработке синтаксиса Perl, постоянно удерживал в голове идею лингвистической основы будущего инструмента, и в меру своего понимания реализовал ее. Эта означает, что когда вы будете произносить фразы на привычном вам языке, то ваши ожидания будут оправданы, -- эти фразы, по большей части, будут выглядеть одинаково и на английском языке, и на Perl.
Например, большинство языков программирования имеют оператор if, который можно
использовать, для написания примерно такой конструкции:
if (condition) {
do_something();
}
Однако что же случится, если вам потребуется выполнить обработку только если условие принимает значение false? Конечно же вы можете написать что-либо похожее на это:
if (not condition) {
do_something()
}
Однако это уже выглядит несколько громоздко и неэлегантно. В Perl вы можете написать следующее:
unless (condition) {
do_something()
}
Что выглядит куда более по-английски. На самом деле вы можете написать даже так:
do_something() unless condition;
А это уже настолько близко к английскому языку, насколько вообще программистский язык может позволить.
Один программист на Perl как-то рассказывал мне, что однажды он понял, что Perl и он были сделаны друг для друга, после того, как он написал некоторый псевдокод, который описывал возможное решение проблемы, и после того, как он случайно запустил его на Perl, то обнаружил, что тот корректно отработал с первого раза.
Другим примером того, как Perl позволяет писать код, который проще читать, является пример открытия файла. Это обычно довольно просто реализуется в любом языке программирования, но до некоторого момента. И этим моментом является, весьма важная для каждой программы, обработка ошибок, которая в большинстве языков программирования достигается путем достаточно емких конструкций, окружающих оператор открытия файла. Такой код, по открытию файла, на языке C может выглядеть например так:
if ((f = fopen("file.txt", "r")) == NULL) {
perror("file.txt");
exit(0);
}
В то время, как на Perl можно написать нечто такое:
open(FILE, 'file.txt') or die "Can't open file.txt: $!";
Этот пример откроет файл, и сопоставит его файловому хэндлу (прим.перев.: file handle)
FILE, который вы можете позже использовать для чтения данных из файла. Кроме того,
он также проверит результат работы оператора open на наличие ошибок, и если что-то
пошло не так, то он остановит выполнение программы с сообщением о ошибке, в точности
объясняющим причину. И снова, в качестве приза, это все выглядит совсем по-английски.
Однако Perl не для каждого. Некоторые люди получают удовольствие от многословности одних языков программирования, либо от строгости синтаксиса других. Тем не менее, те, кто предпримут усилия в том, чтобы понять Perl, чаще всего становятся наиболее эффективными программистами.
Perl не для каждой задачи. Многие критичные ко времени исполнения подпрограммы лучше всего писать на C, либо на ассемблере. На Perl имеется возможность разделить такую задачу на модули так, чтобы главная программа все же оставалась написанной на Perl, конечно если вы этого желаете.
Одним из преимуществ Perl-а является его свобода (прим.перев.: free). (Свобода в обоих ее смыслах, -- "свобода голоса" (free speech) и "бесплатное пиво" (free bear). Если вас интересует детальное обсуждение преимуществ данного понятия, посетите сайт Free Software Foundation по следующему URL: http://www.fsf.org.) Исходный код Perl доступен для загрузки с большого количества web-сайтов. Наиболее правильным сайтом, с которого можно загрузить Perl (и кроме того, все то, что может потребоваться для Perl-а) является http://www.perl.com, однако исходный текст Perl-а, "зеркалируется" на на сайтах всего мира. Вы можете выбрать сайт, ближайший к вам, из списка на основном сайте. Исходный код снабжен простейшими инструкциями о том, каким образом собрать и инсталлировать Perl. Вам потребуются компилятор языка C и утилита make. (Если у вас нет таких утилит, то вы можете получить копии превосходного компилятора gcc и GNU make, с сайта Free Software Foundation.)
Загрузка исходного кода и его компилирование своим собственным инструментарием является обычным делом на UNIX-системах. Однако, многие Windows-разработчики считают более привычным использование прекомпилированного программного обеспечения. Это также не проблема, так как они могут получить такой прекопилированный бинарный код, названный ActivePerl от фирмы ActiveState по URL http://www.activestate.com. Как и в случае других версий Perl-а, данный дистрибутив явлется свободным.
Perl отличает от других языков некоторое количество возможностей, которые делают его весьма удобным языком для обработки данных. Давайте рассмотрим некоторые из них.
хоть и выглядит именно так для программиста. В нем нет явной фазы компиляции, которая потребовалась бы перед тем, как запустить на исполнение Perl-программу. Это делает разработку Perl-программ весьма быстрой, как если бы разработка полностью освободилась от цикла редактирование-компиляция-тестирование-отладка, который является обычным делом для разработки программ в языках, типа C и C++.
автоматически компилируется каждый раз, как запускается. Это накладывает незначительный штраф на производительность, в тот момент, когда программа запускается, но, тем не менее, когда программа уже запущена, вы не будете иметь таких проблем с производительностью, которые присущи чисто интерпретирующим языкам.
данных'' -- Львиная доля обработки данных состоит в распознавании некоторых частей входных данных и последующего их преобразования. В Perl-е это зачастую достигается использованием регулярных выражений (прим.перев.: regular expressions). Более детально регулярные выражения будут рассмотрены чуть позже, однако на данный момент отметим превосходную поддержку регулярных выражений Perl-ом.
занимаетесь обработкой данных, то обычно требуется строить внутренние структуры, для хранения данных в некой промежуточной форме, перед тем, как записать их в выходной файл. Некоторые языки программирования накладывают ограничения на сложность внутренних структур данных. С появлением Perl 5, Perl не имеет таких ограничений.
часто выполнять обработку данных над сходными типами данных, сходным же образом. Имеет смысл построить библиотеку повторно используемого кода, чтобы сделать процесс написания новых программ как можно легче. Perl имеет весьма мощную систему создания модулей кода, которые очень легко могут вставляться в другие скрипты. К тому же, имеется глобальное хранилище повторно используемых Perl-модулей, доступное посредством Internet по URL http://www.cpan.org. Сокращение CPAN происходит от Comprehensive Perl Archive Network (Исчерпывающая Архивная Сеть Perl-а). Если кто-либо до вас занимался решением некоторой специфичной задачи, то здесь всенепременно такое решение обязательно найдется. Если же вы первым столкнулись с такой проблемой, то почему бы, по ее разрешению, не отправить решение на CPAN? Такой прием работы будет выгодным для всех.
остается фактом, я видел заезженных C-программистов, которые вновь стали энтузиастами своей работы после того, как попробовали Perl. Я не пытаюсь объяснить этот факт, просто предлагаю вам попробовать Perl.
Наилучшим местом, где можно получить свежую информацию о Perl является его домашняя страница по URL http://www.perl.com.
Приложение Б содержит краткий обзор языка программирования Perl, однако если вы желаете обучиться Perl, то желательно найти какой-либо из широко доступных учебников. Если вы не-программист, то лучшим выбором будет ''Elements of Programming with Perl'' от Andrew Johnson (Manning). Программистам, обучающимся новому языку, лучше всего посмотреть в сторону Learning Perl (2nd edition) от Randal Schwartz и Tom Christiansen (O'Reilly), либо ''Perl: The Programmer's Companion'' от Nigel Chapman (Wiley).
Исчерпывающим справочником по Perl-у является книга Programming Perl (3rd edition) от Larry Wall, Tom Christiansen и Jon Orwant (O'Reilly).
Впрочем Perl сам по себе поставляется с огромным количеством документации. Когда
вы инсталируете Perl, Вы можете набрать в командной строке perldoc perl, чтобы
получить список доступной документации.
и их преобразования таким образом, чтобы они были приемлимыми для использования другой системой (приемником данных).
разбора, фильтрации и преобразования.
типов источников (приемников).
неструктурированную или структурированную, запись-ориентированную или иерархическую.
ряда задач обработки данных.
<< '''Часть первая. Основы''' | Data Munging With Perl | Глава 2. Наиболее общие приемы обработки данных >>