Если для операции есть функция Perl, Perl считает, что вам следует использовать ее версию. Тем не менее, вы привели пример модуля Perl , обеспечивающего чистый способ Perl сделать это. Это сильно отличается. Там нет однозначного ответа (как в большинстве вещей), поэтому вы должны решить для себя, что делать:
Правильный ли подход Perl делает это правильно? Например, File :: Copy имеет некоторые ограничения, потому что он принимает некоторые неудобные решения для пользователя, поэтому многие думают, что он сломан. См., Например, File :: Copy против cp / mv .
Подходит ли чистый Perl-подход в приемлемое время? Иногда внешняя программа на несколько порядков быстрее. Иногда это намного медленнее.
Внешние команды обычно переносимы в семействе систем (например, во всех системах, подобных Linux), но, вероятно, не в семействах (например, в Windows и Linux). Ваша терпимость к этому может повлиять на ваш ответ. Даже если вы думаете, что выполняете одну и ту же команду, разные варианты Unix-подобных систем могут иметь разные переключатели для операций.
Передача сложных аргументов - пробелов, кавычек и специальных символов - внешним командам может заставить вас плакать. Вы должны проделать большую непростую работу, чтобы убедиться, что вы правильно обрабатываете аргументы. Подпрограммам Perl все равно.
Вы должны уделять гораздо больше внимания тому, что вы делаете, когда используете внешнюю команду. Если вы просто позвоните rm
, Perl будет искать в вашем PATH
и использовать первое, что называется rm
. Это не значит, что вы думаете, что это программа. Я довольно много пишу об этом в "Техниках безопасного программирования" в Мастеринг Perl .
Если для подхода на основе чистого Perl требуется модуль, особенно если этот модуль имеет много сложных зависимостей, вы можете оказаться в аде зависимости или распространения в будущем.
Лично я начинаю с чистого подхода Perl, пока он не сработает для ситуации.
Для ваших конкретных примеров я бы использовал Perl. Обстреливать awk, который является прото-Perl, просто странно. Вы должны быть в состоянии сделать все, что делает awk правильно, это Perl. Если у вас есть программа awk, вы можете конвертировать ее в Perl с помощью программы a2p :
NR==5
a2p превращает это в (по модулю некоторые установочные биты в начале):
while (<>) {
print $_ if $. == 5;
}
Обратите внимание, что он по-прежнему сканирует весь файл, даже если у вас есть пятая строка. Однако вы можете использовать переведенную программу для начала:
while (<>) {
if( $. == 5 ) {
print;
last;
}
}
Не думаю, что вы должны использовать какую-то другую программу, чтобы избежать этого кода Perl.
Чтобы удалить дерево каталогов, мне нравится File :: Path . У него есть некоторые зависимости, но все они находятся в стандартной библиотеке Perl. Там очень мало боли, если таковые имеются, связанные с этим модулем. Я использовал бы это, пока я не столкнулся бы с проблемой, где это не работало.