Поскольку это более объектно-ориентировано. если Вы выполняете итерации с индексом, Вы принимаете:
a), который те объекты заказаны
b), что те объекты могут быть получены индексом
c), что индексный инкремент поразит каждый объект
d), который тот индекс запускает в нуле
С итератора, Вы говорите, "дают мне все так, что я могу работать с ним", не зная, какова конкретная реализация. (В Java существуют наборы, к которым нельзя получить доступ через индекс)
кроме того, с итератором, никакая потребность волноваться о движении за пределы массива.
Все они разные, и в документации объясняется, чем они отличаются. Захват обратных кавычек и возврат вывода; система
возвращает статус выхода, а exec
никогда не возвращает в случае успеха.
IPC :: System :: Simple , вероятно, то, что вам нужно.
Он предоставляет безопасные переносимые альтернативы обратным кавычкам, system () и другим командам IPC.
Он также позволяет вам избегать использования оболочки для большинства указанных команд, что может быть полезно в некоторых обстоятельствах.
Лучший вариант - использовать какой-нибудь модуль из стандартной библиотеки или из CPAN, который сделает эту работу за вас. Он будет более портативным и, возможно, даже быстрее для быстрых задач (без разветвления системы).
Однако, если этого недостаточно для вас, вы можете использовать один из этих трех, и нет, они не подходят те же самые. Прочтите страницы perldoc в system ()
, exec ()
и обратные ссылки , чтобы увидеть разницу.
Вызов системы
обычно является ошибкой. Например, вместо
system "mv $foo /tmp" == 0
or die "could not move $foo to /tmp";
system "cp $foo /tmp" == 0
or die "could not copy $foo to /tmp";
вы должны сказать
use File::Copy;
move $foo, "/tmp"
or die "could not move $foo to /tmp: $!";
copy $foo, "/tmp"
or die "could not copy $foo to /tmp: $!";
Посмотрите на CPAN модули, которые обрабатывают другие команды за вас. Если вы обнаружите, что пишете много обращений к системе
, возможно, пора вместо этого вернуться к сценарию оболочки.
Ну, чем больше людей, тем больше ответов.
Мой ответ - вообще избегать выполнения внешних команд. Если можете - используйте модули. Нет смысла выполнять «cp», «mv» и множество других команд - существуют модули, которые это делают. Преимущество использования модулей в том, что они обычно работают кроссплатформенно. В то время как ваша система ("mv") может этого не делать.
В ситуации, когда у меня нет другого пути, кроме вызова внешней команды, я предпочитаю использовать IPC :: Run . Идея состоит в том, что все упрощенные методы (обратные кавычки, qx, system, open with pipe) по своей сути небезопасны и требуют внимания к параметрам.
С IPC :: Run я запускаю команды так же, как и я. с системой (@array), которая намного безопаснее, и я могу привязаться к stdin, stdout и stderr отдельно, используя переменные,
Если вы не хотите, чтобы оболочка вмешивалась (обычно вы этого не делаете) и если ожидание системной команды приемлемо, я рекомендую использовать IPC :: Run3
. Он прост, гибок и выполняет обычную задачу по выполнению программы, подаче ей входных данных и правильному захвату выходных данных и потоков ошибок.