ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП |
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы. |
1.2. Выбор значения по умолчаниюПроблемаТребуется закрепить за скалярной переменной значение по умолчанию, но лишь в том случае, если оно не было задано ранее. Довольно часто требуется, чтобы стандартное значение переменной жестко кодировалось в программе, но его можно было переопределить из командной строки или переменной окружения.РешениеВоспользуйтесь оператором || или ||=, работающим как со строками, так и с числами:# Использовать $Ь, если. Значение $B истинно, и $с в противном случае $а = $Ь || $с; # Присвоить $х значение $у. носишь в том случае, # если $х не является истинной $х ||= $у; Если ваша переменная может принимать значения Одни "0", воспользуйтесь функцией defined #использоватъ $b если значение $b определено , и $с в противном случае $а =defined($b) ? $b : $c КомментарийГлавное отличие между этими двумя приемами (defined и ||) состоит, прежде всего, в том, что именно проверяется - определенность или истинность, В мире Perl три определенных значения являются ложными: О, "О" и "". Если ваша переменная содержит одну из этих величин, но вы не хотите изменять ее, 11 не подойдет - приходится выполнять неуклюжие проверки с defined. Часто бывает удобно организовать программу так, чтобы принималась в расчёт истинность или ложность переменных, а не их определенность. В отличие от других языков, где возвращаемые значения ограничиваются 6 и 1, оператор 11 Perl обладает более интересным свойством: он возвращает первый (левый) операнд, если тот имеет истинное значение; в противном случае возвращается второй операнд. Оператор && ведет себя аналогично (для второго выражения), но этот факт используется реже. Для операторов несущественно, что представляют собой их операнды - строки, числа или ссылки; подойдет любое скалярное значение. Они просто возвращают первый операнд, из-за которого все выражение становится истинным или ложным. Возможно, это расходится с возвращаемым значением в смысле булевой алгебры, но такими операторами удобнее пользоваться. Это позволяет установить значение по умолчанию для переменной, функции или более длинного выражения в том случае, если первый операнд не подходит. Ниже приведен пример использования ||, в котором $foo присваивается либо $bar, либо, если значение $bаr ложно, - строка "DEFAULT VALUE":$foo = $bar || "DEFAULT VALUE" В другом примере переменной $dir присваивается либо первый аргумент командной строки программы, либо "/tmp", если аргумент не указан: $dir = shift(@ARGV) || "/tmp" То же самое можно делать и без изменения @ARGV: $dir = $ARGV[0] || "/tmp" Если 0 является допустимым значением $ARGV[0], использовать || нельзя,
потому что вполне нормальное значение будет интерпретировано как ложное.
Приходится обращаться к тернарному оператору выбора:
To же можно записать и иначе, со слегка измененной семантикой: $dir = @ARGV ? $ARGV[0] : "/tmp"
Описание оператора || в perlop(1); описание функций defined и exists
в
1.3. Перестановка значений без использования временных переменныхПроблемаТребуется поменять значения двух скалярных переменных, но вы не хотите использовать временную переменную.РешениеВоспользуйтесь присваиванием по списку:($VAR1, $VAR2) = ($VAR2, $VAR1); КомментарийВ большинстве языков программирования перестановка значений двух переменных требует промежуточного присваивания: $temp = $a;$а = $Ь; $b = $temp; В Perl дело обстоит иначе. Язык следит за обеими сторонами присваивания и за тем, чтобы ни одно значение не было случайно стерто. Это позволяет избавиться от временных переменных: $а = "alpha"; $b = "omega"; ($а, $b) = ($Ь, $а); # Первый становится последним - и наоборот Подобным способом можно поменять местами сразу несколько переменных: ($alpha, $beta, $production) = qw(January March August); # beta перемещается в alpha, # production - в beta, # alpha - в production o ($alpha, $beta, $production) = ($beta, $production, $alpha);
1.4 Преобразование между символами и ASCII-кодамиПроблемаТребуется вывести код, соответствующий некоторому символу в кодировке ASCII, или наоборот - символ по ASCII-коду.РешениеВоспользуйтесь функцией ord для преобразования символа в число или функцией сhr - для преобразования числа в символ: $num = ord($char);$char = chr($num); Формат %с в функциях printf и sprintf также преобразует число в символ: $char = sprintf ("%с", $num); # Медленнее, чем chr($num) printf("Number %d is character %c\n", $num, $num); Number 101 is character e Шаблон С*, используемый в функциях pack и unpack, позволяет быстро преобразовать несколько символов: , @АSCII= unpack("C*". $string); @STRING = pack("С*", $ascii); КомментарийВ отличие от низкоуровневых, нетипизованных языков вроде ассемблера, Perl не считает эквивалентными символы и числа; эквивалентными считаются строки и числа. Это означает, что вы не можете произвольно присвоить вместо символа его числовое представление, или наоборот. Для преобразования между символами и их числовыми значениями в Perl существуют функции chr и ord, взятые из Pascal: $ascii_value = ord("e"); # Теперь 101$character = chr(101); # Теперь "e" Символ в действительности представляется строкой единичной длины, поэтому его можно просто вывести функцией print или с помощью формата %s функций printf и sprintf. Формат %с заставляет printf или sprintf преобразовать число в символ, однако он не позволяет вывести символ, который уже хранится в символьном формате (то есть в виде строки). printf("Number %d is character %c\n",101,101); Функции pack" unpack, chr и ord работают быстрее, чем sprintf. Приведем, пример практического применения pack x unpack: @ascii_character_numbers с unpack("C*", "sasample"); print "@ascii_character_ numbers \n"; 115 97 109 112 108 101 $word=pack("C*",ascii_character_numbers); $word = pack("C*",115, 97, 109, 112, 108, 101); # То же самое print "$word\n", sample А вот как превратить HAL в IBM: $hal = "HAL"; @ascii = unpack("C*", $hal); foreach $val (@ascii) { $val++; # Увеличивает каждый ASCII - код на 1 $ibm = pack("C*), @ascii); print "$ibm\n"; # Выводит "IBM' Функция ord возвращает числа oт 0 до 255. Этот диапазон соответствует типу данных unsigned char языка С. > Смотри также ---------------------------- Описание функций chr. ord, printf, sprintf, pack и unpack в perlfunc(1).
|