PERL: БИБЛИОТЕКА ПРОГРАММИСТА


PERL: БИБЛИОТЕКА ПРОГРАММИСТА - стр. 46


foreach $val (@ascii) {

$val++,        # Увеличивает каждый ASCII-код на 1

}

$ibm = pack( С*). @ascii), print $ibm\n        # Выводит IBM


36   Глава 1 • Строки

Функция ord возвращает числа от 0 до 255. Этот диапазон соответствует типу данных unsigned char языка С.

О Смотри также--------------------------------------------------------------------------------------------

Описание функций chr, ord, printf, sprintf, pack и unpack ърег1/ипс(\).

1.5. Посимвольная обработка строк

Проблема

Требуется последовательно обрабатывать строку по одному символу.

Решение

Воспользуйтесь функцией split с пустым шаблоном, чтобы разбить строку на от­дельные символы, или функцией unpack, если вам нужны лишь их ASCII-коды:

@>array = split(//,   $string);

@array = unpack("O",   Sstring);

Или последовательно выделяйте очередной символ в цикле:

while (/(.)/g) { # . здесь не интерпретируется как новая строка

# Сделать что-то полезное с $1 }

Комментарий

Как говорилось выше, фундаментальной единицей текста в Perl является строка, а не символ. Необходимость посимвольной обработки строк возникает достаточ­но редко. Обычно такие задачи легче решаются с помощью высокоуровневых операций Perl (например, поиска по шаблону). Пример приведен в рецепте 7.7, где для поиска аргументов командной строки используются подстановки.

Если вызвать split с шаблоном, который совпадает с пустой строкой, функция возвращает список отдельных символов строки. При намеренном использовании эта особенность оказывается удобной, однако с ней можно столкнуться и случай­но. Например, /X*/ совпадает с пустой строкой. Не исключено, что вам встретят­ся и другие ненамеренные совпадения.

Ниже приведен пример, который выводит символы строки "an apple a day", отсортированные в восходящем порядке ASCII-кодов:

%seen =();

$string = "an apple a day";

foreach $byte (split //, Sstring) {

$seen($1)++; }

print "unique chars are:   ",   sort(keys %seen),   "\n"; unique   chars   are:   adelnpy




Начало  Назад  Вперед