Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Клуб профессиональных программистов :: Выпуск #32




Perl. Базовые типы и еще немного.


Статья ориентирована на новичков Perl, но не на новичков программирования.
При написании использован Perl 5.6.x и замечательная книга "Perl Programming" (ISBN 0-596-00027-8) в переводном русскоязычном издании - "Программирование на Perl" (ISBN 5-93286-020-0). Эта книга может быть использована как в качестве самоучителя, так и справочника, наравне со штатной документацией, поставляемой в комплекте с Perl.

В Perl логика выполнения зависит от контекста выражения. Контексты бывают разные и, как следствие, много вариантов интерпретации. Из-за этого Perl считают сложным для изучения, но если рассмотреть каждое правило в отдельности, то это вовсе и не сложно.
Кстати, вовсе не обязательно знать и применять все вариантны правил - это сильное отличие Perl от "строгих" языков. Достаточно знать наиболее употребимые правила и не лениться заглядывать в справочник при встрече незнакомого выражения.
Perl позволяет писать очень вольные по синтаксису программы, напоминающие синтаксис английского языка, но для лучшей читаемости и уменьшения вероятности ошибок лучше выработать для себя определенный стиль и стараться его придерживаться.

Я наметил несколько статей для краткого ввода в понимание основ Perl-а. Четкого плана нет - объем и состав будет зависеть от отклика читателей и моего желания (ну и, конечно, наличия времени).
Если что-то в статье будет не понятно - спрашивайте на нашем форуме.
Для обсуждения статей: http://forum.shelek.com/index.php?board=46.0
Для вопросов по Perl-у (но не по статьям): http://forum.shelek.com/index.php?board=121.0


В этой статье я расскажу о типах данных.

Содержание:



1. Базовые типы данных.

Базовые типы часто называют встроенными, но это не совсем верно, так как в Perl встроены и более сложные типы. Базовых типов всего три: скаляр, массив скаляров и хеш скаляров. Переменные этих типов обозначаются префиксами "$", "@" и "%" соответственно.

1.1. Скаляр. Пробразование величин, константы, сравнение.

Скаляр - это одиночное значение. Скаляр внутренне может быть логическим значением, числовым (целым или действительным), строкой или ссылкой на объект любого другого типа. Любая из этих величин может быть преобразована в другую. Perl это делает автоматически, по необходимости (контекстно зависимо).
Исключением является только ссылка - можно автоматически преобразовать ссылку в строку или логическое значение, а другое значение в ссылку - нет. Ссылки же на объекты с перегруженными операторами могут вести себя иначе (как запрограммировано в классе), но в этой статье я этого касаться не буду. Это касается и преобразований - они тоже перегружаемы.
Кроме этого, возможно особое состояние значения - неопределенное. Оно может быть использовано как самостоятельное значение или быть преобразовано в другое, в зависимости от контекста. Для обозначения такой величины используется ключевое слово undef (от англ. undefined). Неопределенное значение соответствует пустой строке в строковом контексте, нолю в контексте арифметических операций и значению "ложь" в логическом выражении. Для работы с неопределенным значением используется функция defined.

1.1.1. Методы преобразования величин.

1.1.1.1. В строку.

Скаляр преобразуется в строку при интерполяции, операции объединения строк (конкатенации) и при использовании скаляра в качестве ключа хеша (по той простой причине, что ключами хеша могут быть только строки).

Код: (perl)
$number = 11; $value = "$number"; # интерполяция
$value = 11 . " рублей"; # конкатенация
$hash{11} = "нечто"; # ключ хеша
$value = "строка" . undef; # преобразование undef в пустую строку

Особенно интересен процесс интерполяции. Интерполяция происходит при помещении имени переменной в интерполируемый строковый контекст (есть и неинтерполируемый). Результатом будет замещение имени значением. Подробнее об этом - чуть позже.
Когда нужно принудительно преобразовать значение в строку, нужно или заключить имя переменной в двойные кавычки (если значение содержится в переменной), или выполнить конкатенацию со строкой (можно с пустой).

1.1.1.2. В число.

Скаляр преобразуется в число при выполнении с ним арифметических действий (+ - * / % ** x neg).

Код: (perl)
$value = 1.0 * "22";
$value = 0 - "-1E-3";
$value = 11 / "2.2"; # числовой контекст - получается целое или плавающее значение
$value = 1 + undef; # преобразование undef в ноль

Если строка не может быть распознана как число, она преобразуется в ноль.
Когда нужно принудительно преобразовать значение в число, его сладывают с числом (типично - с нолем).

1.1.1.3. В логическое значение.

Преобразование в логическое значение происходит в логических выражениях: логическими операторами (&& || ! or and not xor), в тернарном операторе ( ? : ) или в соответствующем контексте операторов условий и циклов. Также логическое значение получается в результате вычисления выражения с операторами сравнения (> < == >= <= != <=> gt lt eq ge le ne cmp).
Преобразование происходит следующим образом: ноль, пустая строка, строка, которая может быть преобразована в ноль (пример: "0"), и undef - преобразуются в ложь, а все остальные значения - истинны. Ссылки всегда истинны, так как являются указателями (перегрузка может изменить это).

Код: (perl)
if (0) { ... } # false
if (1 != 2) { ... } # true
if ("0" || "") { ... } # false
if ("aaaa") { ... } # true
if (undef) { ... } # undef - всегда ложь


1.1.2. Константы.

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

1.1.2.1. Строковые.

Я уже упомянал интерполируемый контекст. Отличие его от неинтерполируемого в том, что некоторые символы имеют специальное значение (выполняют некоторые специфичные функции) и для их включения в строку перед ними нужно поставить символ обратного слеша (backslash - "\"). В обычных строках таких символов четыре - "\", "$", "@", "%". В регурялных выражениях тоже есть зарезервированные символы и их значительно больше.
Кавычки следует рассматиривать как операторы. Почти каждому оператору есть эквивалент.

Строковые константы:

ОператорОписаниеИнтерполяцияСиноним
''
Текст в одиночных кавычках.
Нет
q//
""
Текст в двойных кавычках.
Да
qq//
``
Выполнение команд в оболочке ОС.
Да
qx//
()
Список слов. В () слова разделяются запятыми. В qw// - пробелами.
Нет
qw//
//
Поиск по шаблону. Лучше всего пользоваться формой m// - она нагляднее.
Да (*)
m//
s///
Замена по шаблону.
Да
Нет
y///
Табличная замена символов.
Нет
tr///
""
Регулярное выражение в двойных кавычках.
Да (*)
qr//
(*) Правила интерполяции регулярных выражений рекомендую посмотреть в справочнике.

В перечисленных выше операторах слеши можно заменить на любой символ, кроме пробельных (перевод строки, пробел, табуляция и т.п.). Если в качестве ограничителя используются скобки или кавычки, то они обязательно должны быть парными. В одиночных кавычках интерполяция не происходит, даже если оператор ее подразумевает.
Чтобы не ухудшать вид программы и не наступить на грабли тонкостей некоторых конструкций, не следует заменять слеши на другие символы.  В тоже время, для регулярных выражений замена слеша на другой символ - частая практика (особенно если слеш часто встречается в регулярном выражении). При этом форма оператора поиска по шаблону "//" запрещает замену слешей (единственное исключение) для предотвращения неоднозначности.

Код: (perl)
$value = 'строка1' . "строка2" . qw/два слова/ . (еще, три, слова) . q/строка3/ . qq/строка4/;
$value = `ls -l`; # получение результата выполнения внешней программы в оболочке ОС
$value =~ s/шаблон поиска/замена/;
$value =~ m/шаблон поиска/;
$value =~ tr/ABC/xyz/; # трансляция "A" в "x", "B" в "y" и "C" в "z"

Круглые скобки могут выступать в роли оператора принудительного создания списочного контекста (об этом ниже).
Для удобства задания строковых констант есть еще три формы: встроенные домументы (document here), последовательности кодов (v-строки) и специальные контанты Perl-а.
Встроенные документы. Применяется для удобного задания многострочного текста. Интерполяция текста выполняется. Задается как последовательность "<<" и строковая константа (идентификатор), которой будет завершен текст. Константа может быть голой или в двойных или одиночных кавычках. Документ начинается со строки, следующей за выражением. Терминирующая константа должна быть на строке в гордом одиночестве и в самом ее начале.

Код: (perl)
$value = <<ТЕРМИНАТОР;
строка1
строка2
ТЕРМИНАТОР

Таких документов может быть несколько. В этом случае они располагаются друг за другом без интервалов.

Код: (perl)
$value = "строка1" . <<СТРОКА2 . "строка3" . << 'СТРОКА4' . "строка5";
это строка 2
СТРОКА2
это строка 4
это продолжение строки 4
СТРОКА4

Добавлю еще, что если используется голый идентификатор, то между символами "<<" и идентификатором не должно быть пробелов.
V-строки используются для задания строки последовательностью десятичных кодов, разделенных точками.

Код: (perl)
$value = v32.13.10; # последовательность: пробел, возврат каретки и перевод строки.

Специальные константы Perl-а используются для динамической подстановки таких строк, как имя исполняемого в данный момент файла (__FILE__), номер строки в файле(__LINE__), имя класса (__PACKAGE__) и других.
Есть несколько специальных констант, используемых не по назначению: __DATA__ и __END__. К текстовым константам они прямого отношения не имеют (но тоже полезны).
Имена всех этих констант начинаются и завершаются двумя символами подчеркивания.



Целиком статью можно прочитать на нашем сайте.



Ждем вас также в разделе форума "Идеи для статей".
Здесь собраны вопросы, ответы на которые не сформулировать в двух словах. Попробуйте свои силы.

Подробнее по ссылке: http://forum.shelek.com/index.php/board,105.0.html


И не забудьте посетить наш "домик" на карте в Интернете по ссылке http://www.internetmap.info/cgi-bin/go.cgi?site_id=4131%22%20

А теперь прощаемся с Вами до следующего выпуска.

                                        С уважением, команда Клуба.




В избранное