468x60comp.hardware.ani.


| Содержание | Предисловие | В

Глава 2

    В этой главе:


Скалярные данные

Что такое скалярные данные

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

Числа

Хотя скаляр это либо число, либо строка*, в данный момент нам будет полезно рассмотреть их отдельно. Итак, сначала числа

В Perl для всех чисел используется один и тот же внутренний формат

Как станет ясно из нескольких следующих абзацев, можно задавать и целые (чисто числовые значения, например 17 или

 

 

* Или ссылка, но это более сложная тема.

во внутренних вычислениях Perl использует только значения с плавающей запятой двойной точности*. Это значит, что внутренних цел

Литералы с плавающей запятой

Литерал это способ представления величины в тексте Perl-программы. В своей программе вы можете называть литерал конст

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

1.25 # около единицы с четвертью 7.25е45 # 7,25, умноженное на 10 умноженное на 10 в 24-й степени

# ("большое" отрицательное число)

-12е-24 # минус 12, умноженное на 10 в минус 24-й степени

# (очень маленькое отрицательное число)

-1.2Е-23 # еще одна форма записи этого числа

Целочисленные литералы

Целочисленные литералы также весьма просты, например:

12 15

-2004 3485

Не начинайте целое число с нуля, потому что Perl поддерживает восьмеричные и шестнадцатеричные литералы. Восьмеричные числа начина

- Значение с плавающей запятой двойной точности это то, что компилятор С, который компилировал Perl,-* Если только вы не используете "целочисленный режим", но по умолчанию он не включен.

-** "Начальный нуль" работает только в литералах, но не действует при автоматическом преобразовании строк в числа. Строку данных, выглядящую как восьмеричное или шест-надцатеричное значение, мо

от А до F (в любом регистре) обозначают обычные цифровые значения от 10 до

0377 t восьмеричное 377, то же самое, что десятичное 255

-Oxff # отрицательное шестнадцатеричное FF, то же самое, что десятичное -255

Строки

Строки это последовательности символов (например, hello).

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

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

Строки в одинарных кавычках

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

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

* Есть также here -строки, похожие на

в строку в одинарных кавычках обратную косую, поставьте перед ней еще одну обратную косую черту. Примеры:

'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. Управляющие последовательности

Конструкция

Значение

\п

Переход на новую строку (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

 

Еще одна особенность строк в двойных кавычках состоит в том, что в них производится интерполяция переменных, т.е. при использовании строки все скалярные переменные и переменные-массивы в ней за

Скалярные операции

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

Вообще говоря, операции и выражения Perl представляют собой надмножество операций и выражений, имеющихся в большинстве других АЛГОЛ-и Паскаль-подобных языков программировани

Операции над числами

В Perl применяются обычные операции сложения, вычитания, умножения, деления и т.д. Например:

2+3 #2 плюс 3, или 5 5.1-2.4 #5,1 минус

Кроме того, в Perl используется ФОРТРАН-подобная операция возведения в степень, по которой многие тоскуют в Паскале и С. Эт

Perl поддерживает также операцию деления с остатком. Значение выражения 10 % 3 — остаток от деления 10<

Операции логического сравнения следующие: <, <=, ===, >==, >, !=. Эти операции сравнивают два значения в числовом форм

Вас, вероятно, удивило слово "приблизительно" в комментариях к примерам, которые мы привели в начале этого раздела. Разве при вычитании 2, 4Сравнивая приведенные ниже операторы, вы увидите, что в действительности компьютер получил в результате вышеупомянутого вычитания (функция print f описывается в главе б):

printf ("%.51\n", 5.1 - 2.4)

# 2.699999999999999733546474089962430298328399658203125

print(5.1 - 2.4, "\n") ;

# 2.7

Не обращайте на это особого внимания: стандартный формат функции print для вывода на экран чисел с плавающей запятой обычно ск

Операции над строками

Строковые значения можно конкатенировать операцией ".". (Да, это именно одна точка.) Данная операция изменяет строки-опера

"hello" . "world" # то же самое, что "helloworld" •hello world' . "\n" # то же самое, что

Отметим, что конкатенацию нужно задавать явно при помощи знака ".", а не просто располагать два значения рядом друг с другом.

Еще одна группа операций над строками -— операции сравнения. Эти операции похожи на соответствующие операции ФОРТРАНа, например it

Таблица 2.2. Операции сравнения чисел и строк

Сравнение

Числовое

Строковое

Равно

==

eq

Не равно

! =

пе

Меньше чем

<

It

Больше чем

>

gt

Меньше чем или равно

<=

le

Больше чем или равно

>==

ge

 

Вы, возможно, спросите, почему предусмотрены отдельные операции для чисел и строк, если числа можно автоматически преобразовывать в строки и наоборот. Давайте рассмотрим два значения,Если вы уже имеете опыт программирования на shell в среде UNIX, вы, возможно, заметили, что эти числовые и стр

Есть еще одна строковая операция операция повторения строки, знак которой

"fred" х 3 # "fredfredfred" "barney" х (4+1) # "barney" x 5,

# "barneybarneybarneybarneybarney" (3+2) х 4 #5х4, или "5" х 4,

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

При необходимости число копий (правый операнд) сначала усекается до целого значения (4, 8 превращается в 4). Е

Приоритет и ассоциативность операций

Разным операциям присваивается разный приоритет Это позволяет избежать неоднозначности такого рода, когда две операции пытаются манипулировать тремя операндами. Например, что выполнять

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

При выполнении операций сложения и умножения* очередность их выполнения определяется достаточно просто, но, скажем, при конкатенации строк в сочетании с возведением в степень могут возникнуть п

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

Таблица 2.3. Ассоциативность и приоритет операций: от высокого к низкому

Ассоциативность

Операция

Слева

Операции над списками (справа налево)

Слева

-> (вызов метода, разыменование)

Неассоциативные

++ ~ (автоинкремент, автодекремент)

Справа

** (возведение в степень)

Справа

! ~ \ + - (логическое отрицание, побитовое отри

 

 

цание, операция ссылки, унарное сложение, унарное вычитание)

Слева

=~ !~ (совпадает, не совпадает)

Слева

* / % х (умножение, деление, деление с остатком, повторение строки)

Слева

+ - . (сложение, вычитание, конкатенация строк)

Неассоциативные

Именованные унарные операции (например, chomp)

Слева

& (побитовое И)

Слева

| А (побитовое ИЛИ, побитовое исключающее ИЛИ)

Слева

&& (логическое И)

Слева

1 | (логическое ИЛИ)

Неассоциативные

. . ... (не включающие или включающие граничные значения диапазоны)

Справа

?: (операция выбора, if-then-else)

Справа

= += -= *= и т.д. (присваивание и присваивание с вычислением)

Слева

, => (запятая и запятая-стрелка)

Неассоциативные

Операции над списками (слева направо)

Справа

not (логическое НЕ)

Слева

and (логическое И)

Слева

or xor (логическое ИЛИ, логическое исключающее ИЛИ)

 

* Вы хорошо помните алгебру? Если нет, то в повсеместном использовании круглых скобок ничего предосудительного нет.

В этой таблице каждая операция имеет более высокий приоритет, чем перечисленные за ней, и более низкий приоритет, чем перечисленные перед ней.

Операции одного уровня приоритетов разрешаются в соответствии с правилами ассоциативности. Как и приоритет, ассоциативность определяет порядок выполнения операций, если две операции с одинаковым приоритетом пытаются манипулироват

2 ** з ** 4 # 2 ** (3 ** 4) , или 2 ** 81, или окол

В первом случае операция ** имеет ассоциативность справа, поэтому круглые скобки подразумеваются справа. Операции

Преобразование чисел в строки и обратно

Если строковое значение используется как операнд в операции с числами (например, в операции сложения), Perl автоматически

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

"X" .(4*5) f то же самое, что "X" . 20, или "Х20"

(Помните, что круглые скобки заставляют сначала выполнить 4*5, а затем выполнять операцию конкатенации.)

Другими словами, вам не нужно (в большинстве случаев) беспокоиться о том, что указано в качестве операнда строка или число, поскольку Perl

* Шестнадцатеричные и восьмеричные значения этому автоматическому преобразованию не подлежат. Для интерпретации таких значений следует использовать функции hex<

** Если в командной строке не указана опция -w. В целях обеспечения безопасности всегда задавайте эту опцию.

Скалярные переменные

Имя переменной это имя контейнера, который содержит одно или более значений. Имя переменной остается постоянным на протя

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

переменная $А и переменная $а разные. Все буквы, цифры и знаки подчеркивания в имени переменной имеют значение. Так, переменная

$a_very_long_variable_that_ends_in_l

отличается от переменной

$a_very_long_variable_that_ends_in_2

Имена переменных следует, как правило, подбирать так, чтобы они имели какой-то смысл в связи со значением переменной. Например, имя $xyzl23,

Скалярные операции и функции

Самая распространенная операция, выполняемая над скалярной переменнойприсваивание, которое представляет собой сп

=17; # присвоить переменной $а значение 17

$b = + 3; # присвоить $Ь текущее значение $а плюс 3 (20)

$b == $b * 2; # присвоить $b значение $b, умноженное на 2 (40

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

* Их количество ограничено числом 255. Надеемся, этого достаточно. 2.

В этой таблице каждая операция имеет более высокий приоритет, чем перечисленные за ней, и более низкий приоритет, чем перечисленные перед ней.

Операции одного уровня приоритетов разрешаются в соответствии с правилами ассоциативности. Как и приоритет, ассоциативность определяет порядок выполнения операций, если две операции с одинаковым приоритетом пытаются манипулироват

2 ** 3 ** 4 # 2 ** (3 ** 4) , или 2 ** 81, или около 2.41е24 72/12/3 # (72 / 12)

В первом случае операция ** имеет ассоциативность справа, поэтому круглые скобки подразумеваются справа. Операции

Преобразование чисел в строки и обратно

Если строковое значение используется как операнд в операции с числами (например, в операции сложения), Perl автоматически

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

"X" .(4*5) # то же самое, что "X" . 20, или "Х20"

(Помните, что круглые скобки заставляют сначала выполнить 4*5, а затем выполнять операцию конкатенации.)

Другими словами, вам не нужно (в большинстве случаев) беспокоиться о том, что указано в качестве операнда строка или число, поскольку Perl

* Шестнадцатеричные и восьмеричные значения этому автоматическому преобразованию не подлежат. Для интерпретации таких значений следует использовать функции hex<

** Если в командной строке не указана опция -w. В целях обеспечения безопасности всегда задавайте эту опцию.

Скалярные переменные

Имя переменной это имя контейнера, который содержит одно или более значений. Имя переменной остается постоянным на протя

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

переменная $А и переменная $а разные. Все буквы, цифры и знаки подчеркивания в имени переменной имеют значение. Так, переменная

$a_very_long_variable_that__end.s__in__l

отличается от переменной

$a_very_long_variable_that__ends_in_2

Имена переменных следует, как правило, подбирать так, чтобы они имели какой-то смысл в связи со значением переменной. Например, имя $xyzl23,

Скалярные операции и функции

Самая распространенная операция, выполняемая над скалярной переменнойприсваивание,

=17; # присвоить переменной $а значение 17

$b = + 3; # присвоить $Ь текущее значение $а плюс 3 (20)

$b = $b * 2; # присвоить $b значение $b, умноженное на 2 (40)

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

* Их количество ограничено числом 255. Надеемся, этого достаточно.

вообще опускается. Если вы постоянно присваиваете одной или нескольким переменным новые значения, то неминуемо будете делать ошибки. (Наше решение заключалось в том, чтобы прекратить писать про

Скалярное присваивание не только является операцией, его можно использовать и в качестве значения, аналогично тому как это делается в С. Другими словами, выражение $а=3 имеет значение, аналогично тому как имеет некоторое значение выраже

= 4 + ($а =3); # присвоить 3

# в результате чего $Ь получит значение 7 $d = ($с = 5); # скопировать

Последнее выражение работает, потому что присваивание имеет ассоциативность справа.

Операции присваивания с вычислением

Выражения типа $ а == + 5

= + 5; # без операции присваивания с вычислением $а +=

Эквивалентны и эти строки:

= * 3;

$b *= 3;

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

Другой распространенной операцией присваивания является операция конкатенации строк:

$str = $str . " "; # добавить пробел к $str $str .= " "; # то же самое, но с операцией присваивания

Почти все двоичные операции, записанные таким образом, допустимы. Например, операция возведения в степень записывается как * * =.Как и простая операция присваивания, эти операции также могут быть использованы в качестве значения, которым является новое значение переменной. Например:

= 3;

$b = ($а += 4); # $а и $b теперь равны 7<

Автоинкремент и автодекремент

Казалось бы, для прибавления единицы к $а можно просто записать $а += 1, но Perl

+= 1; # с операцией присваивания ++$а; # с префиксным автоинкрементом $d = 17;

= ++$d; # и $е, и $d теперь равны 18

Здесь операция ++ используется как префиксная, т.е. знак операции стоит слева от операнда. Автоинкремент можно записывать и

= 17;

$d = $с++; # $d равно 17, а $с равно 18

Поскольку значение операнда изменяется, операнд должен быть скалярной переменной, а не просто выражением. Не стоит рассчитывать, что ++16 получит значение 17,Операция автодекремента (") похожа на операцию автоинкремента, но здесь не прибавляется единица, а вычитается. Как и операция автоинкремента, операция автодекремента имеет д

= 12;

--$х; # $х теперь равно 11

= $х"; # $у равно 11, а $х - 10

Операции автоинкремента и автодекремента выполняются и над значениями с плавающей запятой. Автоинкрементирование переменной со значением 4,2 Операция автоинкрементирования выполняется даже над строками. См. по данному вопросу книгу Programming Perl или man

Функции chop и chomp

Весьма полезной иногда бывает встроенная функция chop. Эта функция принимает один аргумент, указываемый в круглых скобках<

= "hello world";

chop($x); # $x теперь имеет значение "hello worl"

Обратите внимание: значение аргумента здесь меняется, отсюда и требование к наличию скалярной переменной, а не просто скалярного значения. Писать chop (' suey'),

Возвращаемое значение для этой функции отброшенный символ (в приведенном выше примере с "hello world"

== chop($x); # НЕВЕРНО: заменяет $х ее последним символом chop($x); # В

Если в функции chop задать пустую строку, то она ничего не сделает и ничего не возвратит, не выдавая сообщения об ошибке и вообще

При усечении уже усеченной строки отбрасывается еще один символ. Например:

= "hello world\n";

chop $a; # теперь $а имеет значение "hello world" chop $a; # оп-ля! теперь $а имеет значение "hello worl"

Если вы не уверены в том, есть ли в конце переменной символ новой строки, можете использовать несколько более безопасную операцию chomp,

== "hello world\n";

chomp ($a); # теперь $а имеет значение "hello world" chomp ($a); # ага! никаких изменен

* Если вы не используете соответствующий здравому смыслу ключ -w.

** Или иное значение, которое задано переменной $ \ в качестве разделителя входных записей.

Интерполяция скаляров в строках

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

= "fred";

$b = "some text $a"; # $b имеет значение "some text fred" $c = "no such variable $what"; # $c имеет значение

Текст, который заменяет переменную, не просматривается, т.е. даже при наличии в нем знаков доллара никакие дальнейшие замены не производятся:

= *$fred'; # буквально знак доллара и слово "fred" = "h

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

$fred = 'hi';

$barney = "a test of " . '$fred'; # буквально: 'a test of $fred' $barney2= "a test of \$fred"; # то же самое

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

$fred = "pay"; $fredday = "wrong!";

$barney = "It's $fredday"; # не день зарплаты payday, a "It's wrong!" $barney = "It's ${fred}day"; # теперь $barney<

* И переменных-массивов, но этот вопрос мы будем рассматривать в главе 3 Массивы и списочные данные.

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

$bigfred = "\Ufred"; # $bigfred имеет значение "FRED"

$fred = "fred"; $bigfred = "\U$fred"; # то же самое

$capfred = "\u$fred"; # $capfred имеет значение "Fred"

$barney = "\LBARNEY"; # $barney теперь имеет значение "barney"

$capbarney = "\u\LBARNEY"; # $capbarney теперь имеет значение "Barney"

$bigbarney = "BARNEY"; $capbarney = "\u\L$bigbarney"; # то же самое

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

Термин "интерполяция переменных" иногда заменяют термином "интерполяция двойных кавычек", потому что интерполяция выполняется в строках, заключенных в двойные кавычки. (А также в строках, заключенных в обратные кавычки, которые мы рассм

<STDIN> как скалярное значение

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

а как же ввести в Perl-программу какое-либо значение? Вот самый простой способ. Каждый раз, когда там, где требуется скалярное значение, вы используете дескриптор <STDIN>, PerlВ конце строкового значения дескриптора <STDIN> обычно стоит символ новой строки. Чаще всего от этого символа нужно избавляться сразу же (ведь между

= <STDIN>; # читаем текст chomp($a); # избавляемся от надоедл

* Вы, возможно, придете к выводу, что легче воспользоваться функциями uc, ucfirst, lc И

Общепринятое сокращение этих двух строк выглядит так:

chomp($a = <STDIN>) ;

Присваивание внутри круглых скобок продолжает относиться к $а даже после того, как этой переменной уже присвоено значение. Таким образом, функция chomp

Вывод с помощью функции print

Итак, мы вводим значения с помощью дескриптора <stdin>. А как их вывести из программы? С помощью функции

print("hello world\n"); # выводится hello world с символом новой строки print "hello world\n"; #

Обратите внимание на второй пример, где показана форма функции print без круглых скобок. Использовать скобки или нетМы увидим, что для функции print можно задавать список значений, но поскольку про списки мы еще не говорили, отложим этот вопрос до главы 6.

Значение undef

Что будет, если использовать скалярную переменную до того, как ей присвоено значение? Ничего серьезного, в общем-то, не произойдет. До присваивания значения переменные имеют значениеМногие операции возвращают undef, когда их аргументы выходят за пределы диапазона или не имеют смысла. Если вы не делаете ничего особенного, вы получите в подобном случае ну

Одна из уже знакомых нам операций, которая в определенных обстоятельствах возвращает undef — это операция <stdin>.

Упражнения

Ответы к упражнениям приведены в приложении А.

1. Напишите программу, которая вычисляет длину окружности с радиусом 12, 5. Длина окружности равна 2я (около

2. Модифицируйте программу из предыдущего упражнения так, чтобы она запрашивала и принимала значение радиуса окружности у пользователя.

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

4. Напишите программу, которая считывает строку и число и выводит на экран строку столько раз, сколько задано числом, причем каждый раз с новой строки. (Совет: используйте о



|     Назад     |  

| Содержание | Предисловие | В



Сайт создан в системе uCoz