Что такое скалярные данные
Скаляр — это простейший вид данных, которыми манипулирует Perl. Скаляр — это либо число (допустим, 4 или 3.25е20), либо строка символов (например, hello или Gettysburg Address). Хотя в общем-то числа и строки — это совершенно разные вещи, в Perl они используются практически как взаимозаменяемые понятия, поэтому мы опишем их в одной главе.
Над скалярной величиной можно производить операции (например, суммирование или конкатенацию), полученный результат, как правило, также является скаляром. Скалярную величину можно сохранять в скалярной переменной. Скаляры можно читать из файлов и с устройств, а также записывать в файлы и на устройства.
Числа
Хотя скаляр — это либо число, либо строка*, в данный момент нам будет полезно рассмотреть их отдельно. Итак, сначала числа, а через минуту — строки.
В Perl для всех чисел используется один и тот же внутренний формат
Как станет ясно из нескольких следующих абзацев, можно задавать и целые (чисто числовые значения, например 17 или 342), и числа с плавающей запятой (действительные числа, например 3,14 или 1,35, умноженное на 1025). При этом
* Или ссылка, но это более сложная тема.
во внутренних вычислениях Perl использует только значения с плавающей запятой двойной точности*. Это значит, что внутренних целых величин в Perl нет; целочисленная константа в программе рассматривается как эквивалентное значение с плавающей запятой**. Вы, вероятно, не заметите этого преобразования (или попросту проигнорируете его), но в любом случае не нужно искать целочисленные операции (как дополнение к операциям с плавающей запятой), ибо их попросту нет.
Литералы с плавающей запятой
Литерал —
это способ представления величины в тексте Perl-программы. В своей программе вы можете называть литерал константой, но мы будем пользоваться термином литерал.
Литералы — это способ представления данных в исходном тексте вашей программы как входной информации для компилятора Perl. (Данные, которые читаются из файлов или записываются в файлы, трактуются похоже, но не совсем так.)
Perl принимает полный набор литералов с плавающей запятой, которыми пользуются программисты, работающие на С. Допускаются числа с десятичными запятыми и без них (включая необязательный префикс "плюс" или "минус"). Кроме того, можно использовать показатель степени числа десять (экспоненциальное представление) с буквой Е. Например:
1.25 # около единицы с четвертью 7.25е45 # 7,25, умноженное на 10 в 45-й степени (большое число)
-6.5е24 # минус 6,5, умноженное на 10 в 24-й степени
# ("большое" отрицательное число)
-12е-24 # минус 12, умноженное на 10 в минус 24-й степени
# (очень маленькое отрицательное число)
-1.2Е-23 # еще одна форма записи этого числа
Целочисленные литералы
Целочисленные литералы также весьма просты, например:
12 15
-2004 3485
Не начинайте целое число с нуля, потому что Perl поддерживает восьмеричные и шестнадцатеричные литералы. Восьмеричные числа начинаются с нуля, а шестнадцатеричные — с Ох или ох***. Шестнадцатеричные цифры
- Значение с плавающей запятой двойной точности — это то, что компилятор С, который компилировал Perl, использовал для объявления double.
-* Если только вы не используете "целочисленный режим", но по умолчанию он не включен.
-** "Начальный нуль" работает только в литералах, но не действует при автоматическом преобразовании строк в числа. Строку данных, выглядящую как восьмеричное или шест-надцатеричное значение, можно преобразовать в число с помощью функций oct или hex.
от А до F (в любом регистре) обозначают обычные цифровые значения от 10 до 15. Например:
0377 t восьмеричное 377, то же самое, что десятичное 255
-Oxff # отрицательное шестнадцатеричное FF, то же самое, что десятичное -255
Строки
Строки — это последовательности символов (например, hello). Каждый символ представляет собой 8-битовое значение из 256-символьного набора (при этом символ NUL ничего особенного, как в некоторых языках, собой не представляет).
Самая короткая из возможных строк не содержит ни одного символа. Самая длинная строка заполняет всю наличную память (но сделать с ней что-либо вы вряд ли сможете). Это соответствует принципу "отсутствия встроенных ограничений", которому Perl следует при каждой возможности. Обычно строки представляют собой последовательности букв, цифр и знаков препинания, коды которых лежат в диапазоне ASCII 32 — 126. Однако возможность наличия в строке любого символа с кодом от 0 до 255 означает, что вы можете создавать, просматривать необработанные двоичные данные и манипулировать ими как строками — то, что вызвало бы серьезные трудности в большинстве других языков. (Например, можно "залатать" свою операционную систему, прочитав нужный фрагмент кода как Perl-строку, внеся изменение и записав результат обратно на диск.)
Как и числа, строки могут иметь литеральное представление (способ представления строкового значения в Perl-программе). Литеральные строки бывают двух видов: в одинарных кавычках и в двойных кавычках*. Есть еще одна похожая форма: строка в обратных кавычках ('вот такая'). Это не столько литеральная строка, сколько способ выполнения внешних команд и получения их результатов. Более подробно этот вопрос рассматривается в главе 14.
Строки в одинарных кавычках
Строка в одинарных кавычках
представляет собой последовательность символов, заключенную в одинарные кавычки. Одинарные кавычки частью самой строки не являются, они служат лишь для того, чтобы Perl мог определить начало и окончание строки. Все символы, стоящие между кавычками (в том числе символы новой строки, если строка разбивается на несколько экранных строк), действительны внутри строки. Два исключения:
чтобы вставить одинарную кавычку в строку, уже заключенную в одинарные кавычки, поставьте перед ней обратную косую черту. Для того чтобы вставить
* Есть также here -строки, похожие на here-локу менты shell. Они рассматриваются в главе 19, Программирование CGI. См. также главу 2 книги Programming РеНи man-страницу pcrldata( I).
в строку в одинарных кавычках обратную косую, поставьте перед ней еще одну обратную косую черту. Примеры:
'hello' # пять символов: h, e, 1, 1, о
'don\'t' # пять символов: d, о, п, одинарная кавычка, t
'' # пустая строка (без символов)
'silly\\me' # silly, обратная косая, те
'hello\n' # hello, обратная косая, п
'hello
there' # hello, новая строка, there (всего 11 символов)
Отметим, что пара символов \п внутри строки в одинарных кавычках интерпретируется не как символ новой строки, а как два символа: обратная косая и п. (Обратная косая имеет специальное значение только в том случае, если за ней следует еще одна обратная косая или одинарная кавычка.)
Строки в двойных кавычках
Строка в двойных кавычках
действует почти так же, как С-строка. Это тоже последовательность символов, но на этот раз — заключенная в двойные кавычки. Теперь, однако, обратная косая приобретает полную силу и может задавать определенные управляющие символы и вообще любой символ в восьмеричном и шестнадцатеричном форматах. Вот некоторые строки в двойных кавычках:
"hello world\n" # hello world и новая строка
"new \177" # new, пробел и символ удаления (восьмеричное 177)
"coke\tsprite" # coke, знак табуляции, sprite
Широко используются сочетания обратной косой черты с различными символами (так называемая управляющая последовательность с обратной косой).
Полный перечень управляющих последовательностей, которые применяются в строках в двойных кавычках, приведен в табл. 2.1.
Таблица 2.1. Управляющие последовательности
Конструкция | Значение |
\п | Переход на новую строку (Newline) |
\г | Возврат к началу строки (Return) |
\t | Табуляция |
\f | Переход к новой странице (Formfeed) |
\b | Возврат на предыдущую позицию с удалением символа (Backspace) |
\а | Сигнал |
\е | Escape |
Конструкция | Значение |
\007 | Восьмеричное ASCII-значение (в данном случае 07 = сигнал) |
\x7f | Шестнадцатеричное ASCII-значение (в данном случае 7f = удалить) |
\сС | Управляющий символ (здесь Ctri+C) |
\\ | Обратная косая |
\" | Двойная кавычка |
\1 | Перевод следующей буквы в нижний регистр |
\L | Перевод в нижний регистр всех последующих букв до \е |
\U | Перевод в верхний регистр следующей буквы |
\U | Перевод в верхний регистр всех следующих букв до \Е |
\Q | Заключить в обратные косые все небуквенные и все нецифровые символы до \Е |
\E | Отменить действие последовательности \L, \u или \Q |