Обработка текстовых полей переменной длины
Проблема
Требуется извлечь из входных данных поля переменной длины.
Решение
Воспользуйтесь функцией split с шаблоном,
совпадающим с разделителями
# Имеется $ЗАПИСЬ с полями, разделенными шаблоном ШАБЛОН.
# Из записи извлекаются @ПОЛЯ.
@ПОЛЯ = split(/ШАБЛОН/, $ЗАПИСЬ);
Комментарий
Функция split вызывается с тремя аргументами: шаблон, выражение и лимит (максимальное
количество извлекаемых полей). Если количество полей во входных данных превышает лимит,
лишние поля возвращаются неразделенными в последнем элементе списка. Если лимит не указан,
возвращаются все поля (кроме завершающих пустых полей). Выражение содержит разделяемую
строковую величину. Если выражение не указано, разделяется переменная $_. Шаблон
совпадает с разделителем полей. Если шаблон не указан, в качестве разделителей используются
смежные последовательности пропусков, а начальные пустые поля отбрасываются.
Если разделитель входных полей не является фиксированной строкой, можно вызнать
split так, чтобы функция возвращала разделители полей вместе с данными, — для этого в
шаблон включаются круглые скобки. Например:
split (/([+-])/,"3+5-2");
возвращает список:
(3, '+', 5, '-', 2)
Поля, разделенные двоеточиями (в стиле файла /etc/passwd), извлекаются cледующим образом:
@fields = split(/:/, $record);
Классическое применение функции split — извлечение данных, разделенных пропусками:
@fields = split(/\s+/, $record);
Если $ЗАПИСЬ начинается с пропуска, в последнем варианте первому элементу списка
будет присвоена пустая строка, поскольку split сочтет, что запись имеет начальное пустое
поле. Если это не подходит, используйте особую форму split:
@fields = split(" ", $ЗАПИСЬ);
В этом случае split ведет себя так же, как и с шаблоном /\s+/, но игнорирует начальный пропуск.
Если разделитель может присутствовать внутри самих полей, возникает проблема.
Стандартное решение — снабжать экземпляры разделителя в полях префиксом \.
См. такжеОписание функции split
Proverte kod v komentariyah gde pro list tam oshibki detskie
Оставить комментарий:
|
|