Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 [ 22 ] 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103

функции chop и chomp

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

$х = "hello world";

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

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

Возвращаемое значение для этой функции - отброшенный символ (в приведенном выше примере с "hello world" это буква d). Следующий код, очевидно, неверен:

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

Если в функции chop задать пустую строку, то она ничего не сделает и ничего не возвратит, не выдавая сообщения об ошибке и вообще никак не реагируя*. Большинство операций в Perl имеют разумные граничные условия; другими словами, вы можете использовать их в пределах накладываемых ограничений и за ними, причем часто без какой-либо реакции с их стороны. Некоторые утверждают, что это один из фундаментальных недостатков Perl, а другие пишут первоклассные программы, нисколько не утруждая себя заботой о соблюдении этих ограничений. Вам решать, к какому лагерю присоединяться.

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

$а -= "iiello world\n";

chop $а; # теперь $а имеет значение "hello world"

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

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

$а = "hello worldXn";

chomp (?а); # теперь $а имеет значение "hello world" chomp ($а); # ага! никаких изменений в $а не произошло

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

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



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

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

$а = "fred";

$b = "some text 5a"; # $b имеет значение "some text fred"

5c = "no such variable -Swhat"; # $c имеет значение "no such variable "

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

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

$у = "hey $х"; # значение - hey $fred; двойной подстановки нет

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

$fred = hi ;

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

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

5 fred = "pay"; .Sfredday = "wrong!";

Sbarney = "Its ."Jfredday"; # не день зарплаты payday, a "Its vjrong! " $barney = "Its 5{fredlday"; # теперь $barney получает значение "Its payday" $barney2 = "Its 5fred"."day"; # еще один способ

5barney3 = "Its " . 5fred . "day"; # и еще один

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



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

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

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

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

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

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

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

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

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

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

Если вы - типичный хакер, то, вероятно, давно уже задаетесь вопросом: а как же ввести в Perl-программу какое-либо значение? Вот самый простой способ. Каждый раз, когда там, где требуется скалярное значение, вы используете дескриптор <STDIN>, Perl читает следующую полную строку текста со стандартного ввода (до первого символа новой строки) и использует ее в качестве значения этого дескриптора. Термином "стандартный ввод" может обозначаться MFroroe, но если вы не делаете в своей программе ничего необычного, это означает терминал пользователя, вызвавшего вашу программу (вероятнее всего, ваш собственный терминал). Если строки, которую можно было бы прочитать, еще нет (типичный случай, если только вы заранее не набрали полную строку), Perl-программа останавливается и ждет, пока вы не введете какие-нибудь символы и вслед за ними символ перехода на новую строку.

В конце строкового значения дескриптора <STDIN> обычно стоит символ новой строки. Чаше всего от этого символа нужно избавляться сразу же (ведь между hello и hello\п - большая разница). Здесь и приходит на помощь знакомая нам функция chomp. Типичная последовательность ввода выглядит примерно так:

5а = <STDIN>; # читаем текст

chomp($а); # избавляемся от надоедливого символа новой строки

Вы, возможно, придете к выводу, что легче воспользоваться функциями ис, ucf irst, Ic и Icf irst.

74 Hsi/uncM Perl



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 [ 22 ] 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103