Введение в обработку текста на Perl

Perl, который часто называют «швейцарским армейским ножом» среди языков программирования, известен своими мощными возможностями обработки текста. Будь вы опытным разработчиком или новичком, Perl может упростить и оптимизировать ваши задачи по работе с текстом. В этой статье мы рассмотрим практические примеры и лучшие практики использования Perl для обработки текста, включая регулярные выражения, манипуляцию JSON и парсинг HTML.

Поиск текста с помощью регулярных выражений

Регулярные выражения (regex) — это краеугольный камень обработки текста в Perl. Вот простой пример, чтобы вы начали:

Пример: поиск имён в файле.

Предположим, у вас есть файл с именем names.txt, содержащий список имён:

Steve Smith
Jane Murphy
Bobby Jones
Elizabeth Arnold
Michelle Swanson

Чтобы найти и распечатать все строки, содержащие имя «Elizabeth», вы можете использовать следующий скрипт на Perl:

use warnings;
use strict;

open my $fh, '<:encoding(UTF-8)', "names.txt" or die "Could not read file\n";

while (<$fh>) {
    print if /Elizabeth/;
}

Этот скрипт открывает файл, читает его построчно и печатает любую строку, которая соответствует регулярному выражению /Elizabeth/ [3].

Иногда вам нужно больше, чем просто простое соответствие. Например, вы можете захотеть изменить «Robert» на «Bob», только если за ним следует «Dylan».

Вот как можно этого добиться с помощью поиска назад:

perl -i.bkp -pe 's/Robert (?=Dylan)/Bob /g' names.txt

Эта однострочная команда использует положительный просмотр назад (?=Dylan) для того, чтобы гарантировать, что «Robert» будет заменён на «Bob» только в том случае, если за ним идёт «Dylan» [3].

Сбор текста вокруг совпадений

Perl предоставляет специальные переменные для сбора текста вокруг ваших совпадений. Вот пример:

Пример: сбор дат.

Предположим, у вас есть файл с датами в разных форматах, и вы хотите собрать эти даты:

use strict;
use warnings;

while (<DATA>) {
    print if m%
        (?<![-/\d]) # не предшествует дефис, слеш или цифра
        ((\d\d?)|[A-Z][a-z]*\.?) # месяц 1 или 2 цифры, или слово с необязательным дефисом
        (?=[-/]) # следует дефис или слеш
        (/|-)\d\d? # 1 или 2 значный день
        (/|-)\d{2,4} # 2 или 4 значный год
    %x;
}

__DATA__
2024-11-13
Nov 13, 2024
13-Nov-2024

Этот скрипт использует регулярное выражение для соответствия датам в нескольких форматах и печатает совпадающие строки [3].

Парсинг HTML

Парсинг HTML — ещё один важный аспект обработки текста. Хотя можно использовать регулярные выражения, часто лучше применять специальные модули, чтобы избежать сложностей HTML.

Пример: использование HTML::Parser.

Вот пример использования модуля HTML::Parser для извлечения текста внутри тега <title> HTML-документа:

use HTML::Parser ();

sub start_handler {
    return if shift ne "title";
    my $self = shift;
    $self->handler(text => sub { print shift }, "dtext");
    $self->handler(end => sub { shift->eof if shift eq "title"; }, "tagname,self");
}

my $p = HTML::Parser->new(api_version => 3);
$p->handler(start => \&start_handler, "tagname,self");
$p->parse_file(shift || die) || die $!;
print "\n";

Этот скрипт настраивает HTML::Parser для печати текста внутри тега <title> HTML-файла [2].

Манипуляции с JSON

JSON — распространённый формат обмена данными, и Perl упрощает работу с данными JSON.

Пример: кодирование и декодирование JSON.

Вот как можно кодировать и декодировать JSON, используя модуль JSON::MaybeXS:

use JSON::MaybeXS;

my $data_structure = { name => 'John', age => 30 };
my $json_text = encode_json($data_structure);
my $decoded_data = decode_json($json_text);

print $decoded_data->{name}; # печатает "John"
print $decoded_data->{age};  # печатает "30"

В этом примере показано, как преобразовать структуру данных Perl в JSON и обратно [2].

Однострочники командной строки

Однострочники Perl невероятно полезны для быстрых задач обработки текста. Вот несколько примеров:

Пример: замена запятых на двоеточия.

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

seq 10 | paste -sd, | perl -pe 's/,/ : /'

Этот однострочник заменяет первую запятую в выводе на двоеточие [4].

Пример: печать определённых строк.

Чтобы напечатать вторую и четвёртую строки файла, вы можете использовать:

perl -ne 'print if $.==2 || $.==4' poem.txt

Этот скрипт считывает файл построчно и выводит указанные строки [4].

Лучшие практики:

  • Всегда начинайте свои скрипты Perl с use strict; и use warnings;, чтобы обеспечить надёжность и безошибочность кода.
  • Используйте конструкции типа open my $fh, '<:encoding(UTF-8)', "file.txt" or die "Не удалось прочитать файл\n";, чтобы корректно обрабатывать ошибки.
  • Применяйте модули. Perl имеет широкий спектр модулей, которые могут упростить ваши задачи обработки текста. Например, используйте HTML::Parser для парсинга HTML и JSON::MaybeXS для манипуляций с JSON.
  • Избегайте сложных регулярных выражений. Хотя регулярные выражения мощные, они могут быть сложными и трудными в обслуживании. Используйте специализированные модули там, где это возможно, чтобы избежать проблем с регулярными выражениями.

Заключение:

Perl — универсальный инструмент для обработки текста, предлагающий широкий спектр функций и модулей для упрощения ваших задач. От простых поисков с использованием регулярных выражений до сложных манипуляций с HTML и JSON, Perl предоставляет необходимые инструменты для решения любых задач обработки текста. Следуя лучшим практикам и используя мощь экосистемы Perl, вы сможете писать эффективный, читаемый и поддерживаемый код.