Perl краток и хорош, действительно хорош в тексте. Рассмотрим Регlэквивалент нашего первого сценария bash:
admin@serverl:$ perl ne 'print if /alf/i' /etc/passwd
Значение /образец/ соответствует образец, тогда как следующий аргумент i нечувствителен к регистру. Вот эквивалент версии сценария, который мы будем использовать для увеличения программы в соответствии с нашими требованиями:
}
}
Многие элементы синтаксиса Perl зашифрованы, но некоторые напоминают синтаксис оболочки (или другие обычные инструменты UNIX), и, если вам известны эти инструменты, вам не составит труда их вспомнить. В частности, вы можете видеть задачи while и if в предыдущем сценарии, и они ведут себя так, как вы могли бы ожидать, изучив эквиваленты оболочки. Синтаксис <> также напоминает о перенаправлении оболочки < и >: он обуславливает каждую итерацию цикла whi 1 е для прочитывания каждой строки вывода. Обратите внимание, что, в отличие от bash, переменные в Perl требуют указания начального символа $, даже если вы присваиваете значения. Команда pri nt отображает то, что было найдено <>.
Perl располагает альтернативным обратным синтаксисом i f, сохраняющим некоторые символы:
}
Сценарий (назовем его f i nduser. pi) предполагает, что пароль файла считывается из стандартного вывода, поэтому запустите его таким образом:
admin@serverl:$ ./finduser.pl alf < /etc/passwd
Следующая версия открывает непосредственно файл пароля:
open(FILE. Sfname) or dieC'Can't open $fname\n"): while (
}
}
close(FILE):
Для ограничения соответствий полем имени, как мы сделали в разделе bash, будем использовать сильную сторону Perl:
open(FILE. $fname) or dieC'Can't open $fname\n"): while (
}
}
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 в некоторых системах:
Spattern = shift;
while ((Sname,Spasswd,Suid,Sgid,
Squota.Scomment,Sgcos.Sdi r. Sshel1.Sexpire) = getpwent) { if (Sgcos — /Spattern/i) { print "Sgcos\n";
}
}
}
}
Наконец, ограничим поиск обычными пользователями (ui d > 500). Это несложное дополнение:
}
}