Perl краток и хорош, действительно хорош в тексте. Рассмотрим Регlэквивалент нашего первого сценария bash:
admin@serverl:$ perl ne 'print if /alf/i' /etc/passwd
Значение /образец/ соответствует образец, тогда как следующий аргумент i нечувствителен к регистру. Вот эквивалент версии сценария, который мы будем использовать для увеличения программы в соответствии с нашими требованиями:

#!/usr/bi n/perl my $pattern = shift: while (<>) { if (/$pattern/i) { print;

}
}
Многие элементы синтаксиса Perl зашифрованы, но некоторые напоминают синтаксис оболочки (или другие обычные инструменты UNIX), и, если вам известны эти инструменты, вам не составит труда их вспомнить. В частности, вы можете видеть задачи while и if в предыдущем сценарии, и они ведут себя так, как вы могли бы ожидать, изучив эквиваленты оболочки. Синтаксис <> также напоминает о перенаправлении оболочки < и >: он обуславливает каждую итерацию цикла whi 1 е для прочитывания каждой строки вывода. Обратите внимание, что, в отличие от bash, переменные в Perl требуют указания начального символа $, даже если вы присваиваете значения. Команда pri nt отображает то, что было найдено <>.
Perl располагает альтернативным обратным синтаксисом i f, сохраняющим некоторые символы:

#!/usr/bin/perl my Spattern = shift; while (<>) { print if /Spattern/i;

}
Сценарий (назовем его f i nduser. pi) предполагает, что пароль файла считывается из стандартного вывода, поэтому запустите его таким образом:
admin@serverl:$ ./finduser.pl alf < /etc/passwd
Следующая версия открывает непосредственно файл пароля:

#!/usr/bi ri/perl my Sfname = "/etc/passwd"; my Spattern = shift:

open(FILE. Sfname) or dieC'Can't open $fname\n"): while () { if (/Spattern/i) { print;
}
}
close(FILE):
Для ограничения соответствий полем имени, как мы сделали в разделе bash, будем использовать сильную сторону Perl:

#!/usr/bin/perl my $fname = "/etc/passwd": my Spattern = shift;

open(FILE. $fname) or dieC'Can't open $fname\n"): while () { Sline = S_; @fields = split/:/; if (Sfields[4] =/$pattern/i) { print Sline;
}
}
close(FILE);
Аргумент, замещенный пользователем, читает переменную Spattern, используя задачу shift. Сценарий также определяет другой вид переменной: массив под названием @fields. Функция Perl split помещает каждый отделенный двоеточием элемент строки в один из элементов массива. Затем мы можем извлечь элемент 4 (являющийся на самом деле пятым элементом, поскольку элементы нумеруются, начиная с 0) и сравнить его с учетом регистра с аргументом пользователя.
Все эти сценарии включают чтение строк вывода и соответствие образцов. Поскольку файл /etc/passwd так важен в Linux, можно предположить, что сегодня ктото уже автоматизировал часть этой работы. К счастью, это так: старый добрый Perl предоставляет встроенную функцию под названием getpwent, которая возвращает содержимое /etc/passwd в строку как массив символьных последовательностей. В следующей версии нашего сценария мы назначаем каждому полю собственную переменную; в последующей версии мы будем использовать массив @1 i st для сохранения их всех. В любом случае нам нужно поле gecos (называемое gecos в документации Perl). Обратите внимание, что getpwent возвращает это поле как 6, а не как 4, поскольку getpwent поддерживает два других поля, появляющихся в файлах passwd в некоторых системах:

#!/usr/bin/perl

Spattern = shift;
while ((Sname,Spasswd,Suid,Sgid,
Squota.Scomment,Sgcos.Sdi r. Sshel1.Sexpire) = getpwent) { if (Sgcos — /Spattern/i) { print "Sgcos\n";
}
}

#!/usr/bi n/perl Spattern = shift; while (@fields = getpwent) { if ($fields[6] =/Spattern/i) { print "$fields[6]\n":

}
}
Наконец, ограничим поиск обычными пользователями (ui d > 500). Это несложное дополнение:

#!/usr/bi п/рег1 Spattern = shift; while (@fields = getpwent) { if (Sfields[6] =/$pattern/i and $fields[2] > 500) { print "Sfields[6]\n"

}
}