PERL - Полезные советы
Проверка: если ли в файле обе искомые строки.

Нам необходимо определить, если ли в файле обе строки текста 'george' and 'judy'?


        my ($s1, $s2);
        while (<>) {
                exit 0 if ($s1 ||= /george/) & ($s2 ||= /judy/);
        }
        die "not found\n";
Соль этого фрагмента в использовании операторов ||= (ИЛИ-присвоение) и & (побитовый И). Программа считывает файл по строкам в переменную $_ оператором <>. Как только встретится строка 'george', переменной $s1 будет присвоено значение 1 (истина). Не забывайте, что оператор $s1 ||= /george/ означает то же, что и $s1 = $s1 || /george/ -- как только $s1 примет значение ИСТИНА, программа больше не будет делать проверку на строку /george/. $s2 ||= /judy/ работает подобным образом. Программа закончит свое выполнение как только обе переменные $s1 и $s2 получат значение ИСТИНА.

Интересный момент заключается в использовании оператора побитовое И (&) вместо логического И (&&). Левый и правый аргументы оператора & всегда выполняются в отличие от &&. Этот код просто не будет работать, если использовать оператор && и файл содержит строку 'judy' перед строкой 'george'. Конечно, нельзя всегда заменять оператор && на &, но в данном случае это необходимо.

Автор: Joseph N. Hall


Проверка: если ли в файле все необходимые нам слова.

        die "usage: multi string1,string2,string3 [file1 file2 ...]\n"
                unless @ARGV;

        my @match;
        for (split /,/, shift) {
                my $regex = "\Q$_\E"; # escape regex chars
                push @match, eval 'sub { $_[0] =~ /$regex/o }';
        }
        my $line;
        while (defined($line = <>)) {
                my @left_to_match;
                for (@match) {
                        push @left_to_match, $_ unless $_->($line);
                }
                exit 0 unless @left_to_match;
                @match = @left_to_match;
        }
        die "not found\n";
Это совершенно другой подход. Мы начинает с того, что создаем анонимные функции, каждая из которых возвращает ИСТИНА, когда ее аргумент совпадает с одним из искомых слов. Ссылки на функции хранятся в массиве @match. Затем, для каждой строки входного файла, мы запускаем по циклу все функции. Если функция не нашла совпадения (искомое слово остутствует) мы сохраняем ссылку на эту функцию в другом массиве @left_to_match - они будут работать над следующими строками исходного файла. Когда все функции сработают, в массиве @left_to_match ничего не останется и программа завершится. В противном случае будет выдано диагностическое сообщение.

Автор: Joseph N. Hall