Журнал LinuxFormat - перейти на главную

LXF70:Perl. Переменные и операторы

Материал из Linuxformat
Перейти к: навигация, поиск

Содержание


Perl. Переменные и операторы

Часть 1. В «эпизоде 1» нашей серии Марко Фиоретти (Marco Fioretti) объясняет основные компоненты языка Perl.


Языки сценариев стали так популярны потому, что ценой небольшого падения производительности они берут на себя такую скучную работу, как определение переменных, выделение памяти, возвращение её операционной системе и так далее. Придуманный в конце восьмидесятых Practical extraction and Report Language или Perl исходно предназначался для работы с большими объёмами текста. И хотя он не является самым популярным языком сценариев двадцать первого века, он остаётся лучшим инструментом для решения многих задач. Знаете ли вы, например, что Perl спас проект «Геном человека» (Human Genome Project)? Целиком эту историю можно прочитать по адресу: http://bioperl.org/GetStarted/tpj_ls_bio.html.

В девяностые годы Perl получил широкое распространение, благодаря своему умению генерировать html-страницы. Сейчас эту нишу занял PHP, однако у Perl всё еще есть много поклонников, а так же большая база унаследованного кода, расширений (называемых модулями) и документации, которую легко приспособить для любых нужд.

Вам вовсе не обязательно быть системным администратором или профессиональным программистом для того, чтобы получить пользу от этого языка. Perl может помочь, когда вам нужно быстро обработать текст или даже картинки. Независимо от того, находятся ли эти файлы на вашем жестком диске или в интернете, Perl обладает модулями, способными прозрачно работать и с тем, и с другим.

Используй переменные, Люк!

Почти все основные правила синтаксиса Perl (такие как правила обрамления строк кавычками) очень напоминают или даже идентичны правилам оболочек Unix. Документации по оболочкам существует огромное количество, она не ограничивается учебником из предыдущих выпусков Linux Format. Поэтому, так как общую информацию можно найти в других местах, в эта серия сосредоточена на специфических особенностях языка, начиная с неудобочитаемых переменных. Я нежно люблю Perl, и использую его изо дня в день для решения самых разных задач. Но я должен предупредить вас: критики говорят, что это единственный язык, код на котором выглядит одинаково до и после зашифровки. и если вы не знаете структуры программы на Perl, то так для вас и будет. Давайте рассмотрим компоненты этого языка. Первая вещь, которая раздражает новичков, когда они смотря на Perl-код — это тот факт, что все переменные имеют неалфавитный префикс. Клевещут, что из-за этого экран заполняется нечитаемым мусором. Но мне эти маркеры кажутся очень полезными, так как они сразу же сообщают о структуре соответствующей переменной и о том, что я могу сделать с нею. Вот пример:

$NAMe = 'Johnny';
$AGE = 33;
@BOOK = ('Introduction', 'First Chapter', 'Second Chapter');
%STAR_WARS_FAMILY = ('Father', 'Anakin',
               'Mother', 'Padme',
               'Male twin', 'Luke',
               'Female twin', 'Leia');

Первые две переменные — это скаляры. Скаляр Perl способен содержать один кусочек информации, будь то строка, число или ссылка. Их имена всегда начинаются с символа доллара ($). Строковые скаляры всегда заключаются в единичные('), двойные(") или обратные кавычки(`), так же как и их эквиваленты из оболочек Unix, а числа, по аналогии, обходятся без кавычек.

$A = 'Hello';
$B = '$A Johnny!';
$C = "$A Johnny!";
$D = `ls /usr/bin`;

Здесь переменная $b содержит именно то, что мы указали в коде, $C (благодаря двойным кавычкам) равняется «Hello Johnny!», а $D, поскольку для его значения использовались обратные кавычки, содержит результат выполнения команды ls /usr/bin/.

Упорядоченный список скаляров, проиндексированный номерами, называется массивом и начинается с символа @. Он полезен для хранения чего-либо в последовательном порядке. Один элемент массива обозначается так: символ $, имя массива и номер элемента (начиная с 0) в квадратных скобках. В приведенном выше примере, второй элемент массива @book — это $book[1] и он равен «First Chapter».

Ассоциативные массивы, или коротко говоря хэши (hash) — это последняя из основных категорий переменных языка Perl. Хэш — это группа скаляров, которые проиндексированы, или другими словам к которым можно обратиться не по номерам, а при помощи других скаляров, так называемых ключей. Другими словами, Perl позволяет сказать нам без излишних синтаксических конструкций, что в «семье звёздных войн»(STAR_WARS_FAMILY) отцом (Father) является Энакин (Anakin):$sTar_Wars_FamiLy{‘Father’} = ‘anakin’. Каждый ключ или значение хэша могут быть скаляром любого типа.

Итак, даже самый короткий скрипт на Perl может быть заполнен символами $, @ и %. Но при этом мы можем создавать очень сложные структуры данных, используя минимальное количество префиксов, почти не заботясь об именовании, и при этом всегда понимая, каков смысл каждого кусочка. Это возможно благодаря мощной и немного опасной возможности вкладывать массивы и хэши друг в друга:

%STAR_WARS_FAMILY = (
    'Father', {'Name', 'Anakin',
             'Height (cm)', 210,
             'jobs', ['Slave', 'Podracer pilot', 'Jedi Knight', 'Darth Vader']},
    'Mother', {} # другие такие же данные...
 );
 print "$STAR_WARS_FAMILY{'Father'}{'jobs'}[2]\n";

Это хэш, в котором каждый из элементов первого уровня является в свою очередь хэшем, содержащим элементы name (имя), Height (рост) and jobs (занятия), причём значением элемента jobs является массив. Обратите внимание, как мы различаем массивы и хэши при помощи квадратных и фигурных скобок, даже если они вложены друг в друга. В результате у нас получится, что оператор print в последней строке отобразит строчку Jedi knight (Джедай).

Существует одна встроенная скалярная переменная, о которой вам надо знать. иногда программисты на Perl забывают указать, какую переменную они имели ввиду, например:

print if условие

Эта инструкция указывает, что надо выполнять оператор print при некотором условии, но не говорит, что именно надо напечатать — значение какой переменной? В этом случае интерпретатор Perl использует текущее значение переменной по умолчанию, $_. Её значение определяются предыдущими выражениями, или она может выступать в качестве переменной цикла. Если вы помните об этой особенности, большое количество кода на Perl покажется вам гораздо понятнее.

Помоги мне, Падме

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

$A =10 * 7.5 - 16;
$B = $A % 4; # деление по модулю 4

и номера, и строки можно увеличивать при помощи оператора инкремента

$A = 4;
$B = 'ab';
$A++; # теперь $A равен 5...
$B++; # а $B равен 'ac'!!

Не правда ли это здорово, что буквы тоже можно инкрементировать? Вы также можете соединять строки из нескольких частей:

$FIRST_NAME = 'Luke';
$LAST_NAME = 'Skywalker';
$COMPLETE_NAME = $FIRST_NAME.' '.$LAST_NAME;
$REPEATED_NAME = $FIRST_NAME x 3;

Теперь $COMPLETE_NAME равняется «Luke Skywalker», a $REPEATED_NAME содержит «LukeLukeLuke».

Скаляры можно сравнивать между собой многими разными способами. Давайте попробуем некоторые из них и посмотрим, что получится:

$A < $B; # число $A больше, чем число $B?
$A lt $B; # строка $A располагается в словаре до $B?
$A <=> $B; # какое число меньше, $A или $B?
$A cmp $B; # какая строка располагается раньше, $A или $B?

Некоторые сравнения имеют смысл, только если обе переменные являются или строками, или числами. Например, оператор 'Эта строка в алфавитном порядка стоит перед другой', всегда используется для сортировки в алфавитном порядке. Даже если одна или обе сравниваемые переменные содержат только числа, использование строковых операторов сравнения приведёт к сортировке в алфавитном порядке. Чтобы увидеть это в действии, введите следующую команду в командной строке и проверьте, какие из операторов сравнения вернут истину?.

 perl -e 'if ("dude" lt "hello") {print "dude!\n";} if ("dude" < "hello") {print "Hello!\n";}'

Фактически только первый тест должен завершиться успешно. Его смысл таков: «Верно ли, что строки переданы в алфавитном порядке?». Во втором операторе, используя < вместо lt, мы спрашиваем Perl, правда ли что число «dude» меньше числа «hello»? Конечно, это абсурдный вопрос, и ответ на него предсказуемо непредсказуемый.

Еще одна особенность Perl, о которой стоит знать — это его постоянные преобразования строк в числа и обратно, в зависимости от контекста. Они могут быть огромным подспорьем или же постоянным источником недоразумений, в зависимости от того как часто вы забываете про это.

Я думаю, что на этом достаточно разговоров про скалярные операторы. Когда речь заходит об операторах, работающих с массивами, Perl может сделать многое. Приведённый ниже пример показывает, как отдельный элемент может быть добавлен к массиву, а затем удалён оттуда:

@Jedi = ("Yoda", "Obi Wan"); # несколько рыцарей-джедаев
push(@Jedi, "Anakin"); # юный Энакин встаёт в строй
$gone_to_the_dark_side = pop(@Jedi); # Энакин уже не джедай

Существуют специальные операторы для работы с хэшами. Инструкции, подобные следующим, встречаются в коде на Perl очень часто:

while (($Actor, $Character) = each(%STAR_WARS_CAST));
# или даже
@ACTORS_ONLY = keys(%STAR_WARS_CAST);

Первая строка будет циклически перебирать элементы хэша %STAR_WARS_CAST, каждый раз присваивая ключ очередного элемента и его значение паре скаляров $Actor и $Character, которые вы затем можете обработать, как вам захочется. Оператор key используется в том случае, когда нужно сохранить только ключи хэша в отдельном массиве и работать с ними независимо от значений.

В Perl существует ещё очень много операторов, но у меня не осталось места для их описания. Однако того, что мы уже успели рассмотреть, с лихвой хватит для понимания структуры простого сценария. Свою силу и истинную ценность Perl особенно ярко проявляет в работе с массивами и хэшами.

Персональные инструменты
купить
подписаться
Яндекс.Метрика