| Содержание | Предисловие | В |
Глава 2В этой главе:
Скалярные операции Скалярные переменные Скалярные операции и функции <STDIN> как скалярное значение Упражнения Скалярные данныеЧто такое скалярные данные Скаляр — это простейший вид данных, которыми манипулирует 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 # Строки Строки — это последовательности символов (например, 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. Управляющие последовательности
Еще одна особенность строк в двойных кавычках состоит в том, что в них производится интерполяция переменных, т.е. при использовании строки все скалярные переменные и переменные-массивы в ней за Скалярные операции Оператор обозначает проведение определенной операции, благодаря которой создается новое значение (результат) из одного или нескольких других значений (операндов). Например Вообще говоря, операции и выражения 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. Операции сравнения чисел и строк
Вы, возможно, спросите, почему предусмотрены отдельные операции для чисел и строк, если числа можно автоматически преобразовывать в строки и наоборот. Давайте рассмотрим два значения, Есть еще одна строковая операция — операция повторения строки, знак которой —"fred" х 3 # "fredfredfred" "barney" х (4+1) # "barney" x 5,# "barneybarneybarneybarneybarney" (3+2) х 4 #5х4, или "5" х 4,Последний пример стоит объяснить подробнее. Круглые скобки указывают на то, что эту часть выражения нужно вычислить первой. (Круглые скобки здесь работают так же, как в обычной математике.) Одн При необходимости число копий (правый операнд) сначала усекается до целого значения (4, 8 превращается в 4). ЕПриоритет и ассоциативность операций Разным операциям присваивается разный приоритет Это позволяет избежать неоднозначности такого рода, когда две операции пытаются манипулировать тремя операндами. Например, что выполнять Порядок выполнения операций, определяемый приоритетом, можно изменить с помощью круглых скобок. Выражение, заключенное в скобки, вычисляется в первую очередь, и лишь затем выполняется операция, стоящая за скобками (так, как нас учили на При выполнении операций сложения и умножения* очередность их выполнения определяется достаточно просто, но, скажем, при конкатенации строк в сочетании с возведением в степень могут возникнуть п более того, они могут так и не появиться на страницах этой книги. Пусть, однако, этот факт не отпугнет вас.) Операции, аналогичные операциям С, имеют тот же приоритет, что и в этом языке. Таблица 2.3. Ассоциативность и приоритет операций: от высокого к низкому
* Вы хорошо помните алгебру? Если нет, то в повсеместном использовании круглых скобок ничего предосудительного нет.В этой таблице каждая операция имеет более высокий приоритет, чем перечисленные за ней, и более низкий приоритет, чем перечисленные перед ней. Операции одного уровня приоритетов разрешаются в соответствии с правилами ассоциативности. Как и приоритет, ассоциативность определяет порядок выполнения операций, если две операции с одинаковым приоритетом пытаются манипулироват 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 — это операция <stdin>.Упражнения Ответы к упражнениям приведены в приложении А. 1. Напишите программу, которая вычисляет длину окружности с радиусом 12, 5. Длина окружности равна 2я (около2. Модифицируйте программу из предыдущего упражнения так, чтобы она запрашивала и принимала значение радиуса окружности у пользователя.3. Напишите программу, которая запрашивает и считывает два числа, после чего выводит на экран результат перемножения этих чисел.4. Напишите программу, которая считывает строку и число и выводит на экран строку столько раз, сколько задано числом, причем каждый раз с новой строки. (Совет: используйте о |
| Содержание | Предисловие | В |