Каково различие между системой, должностным лицом и обратными галочками в Perl?

Поскольку это более объектно-ориентировано. если Вы выполняете итерации с индексом, Вы принимаете:

a), который те объекты заказаны
b), что те объекты могут быть получены индексом
c), что индексный инкремент поразит каждый объект
d), который тот индекс запускает в нуле

С итератора, Вы говорите, "дают мне все так, что я могу работать с ним", не зная, какова конкретная реализация. (В Java существуют наборы, к которым нельзя получить доступ через индекс)

кроме того, с итератором, никакая потребность волноваться о движении за пределы массива.

7
задан Josh Lee 19 January 2010 в 07:12
поделиться

6 ответов

Все они разные, и в документации объясняется, чем они отличаются. Захват обратных кавычек и возврат вывода; система возвращает статус выхода, а exec никогда не возвращает в случае успеха.

12
ответ дан 6 December 2019 в 08:16
поделиться

IPC :: System :: Simple , вероятно, то, что вам нужно.

Он предоставляет безопасные переносимые альтернативы обратным кавычкам, system () и другим командам IPC.

Он также позволяет вам избегать использования оболочки для большинства указанных команд, что может быть полезно в некоторых обстоятельствах.

6
ответ дан 6 December 2019 в 08:16
поделиться

Лучший вариант - использовать какой-нибудь модуль из стандартной библиотеки или из CPAN, который сделает эту работу за вас. Он будет более портативным и, возможно, даже быстрее для быстрых задач (без разветвления системы).

Однако, если этого недостаточно для вас, вы можете использовать один из этих трех, и нет, они не подходят те же самые. Прочтите страницы perldoc в system () , exec () и обратные ссылки , чтобы увидеть разницу.

3
ответ дан 6 December 2019 в 08:16
поделиться

Вызов системы обычно является ошибкой. Например, вместо

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 модули, которые обрабатывают другие команды за вас. Если вы обнаружите, что пишете много обращений к системе , возможно, пора вместо этого вернуться к сценарию оболочки.

1
ответ дан 6 December 2019 в 08:16
поделиться

Ну, чем больше людей, тем больше ответов.

Мой ответ - вообще избегать выполнения внешних команд. Если можете - используйте модули. Нет смысла выполнять «cp», «mv» и множество других команд - существуют модули, которые это делают. Преимущество использования модулей в том, что они обычно работают кроссплатформенно. В то время как ваша система ("mv") может этого не делать.

В ситуации, когда у меня нет другого пути, кроме вызова внешней команды, я предпочитаю использовать IPC :: Run . Идея состоит в том, что все упрощенные методы (обратные кавычки, qx, system, open with pipe) по своей сути небезопасны и требуют внимания к параметрам.

С IPC :: Run я запускаю команды так же, как и я. с системой (@array), которая намного безопаснее, и я могу привязаться к stdin, stdout и stderr отдельно, используя переменные,

1
ответ дан 6 December 2019 в 08:16
поделиться

Если вы не хотите, чтобы оболочка вмешивалась (обычно вы этого не делаете) и если ожидание системной команды приемлемо, я рекомендую использовать IPC :: Run3 . Он прост, гибок и выполняет обычную задачу по выполнению программы, подаче ей входных данных и правильному захвату выходных данных и потоков ошибок.

-1
ответ дан 6 December 2019 в 08:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: