Как я могу запускать внешние программы с помощью Perl 6? (например, подобная система в Perl 5)

Я могу использовать system в Perl 5 для запуска внешних программ. Мне нравится думать о system как о миниатюрной «командной строке Linux» внутри Perl. Однако я не могу найти документацию для system в Perl 6. Что эквивалентно?


person Christopher Bottoms    schedule 09.04.2015    source источник


Ответы (2)


Помимо использования shell или _ 2_, которые заменяют system из Perl 5, вы также можете использовать NativeCall для вызова функции libc system.

На моем компьютере с Windows это выглядит так:

use NativeCall;
sub system(Str --> int32) is native("msvcr110.dll") { * };
system("echo 42");
person Christoph    schedule 10.04.2015
comment
Это system в основном то же самое, что и версия Perl 5? - person Christopher Bottoms; 10.04.2015
comment
Если вам нужно указать "msvcr110.dll", я полагаю, это не очень переносимо. Можете ли вы передать ему несколько аргументов, например system("echo" "42") в Perl 5? (Я знаю, что Windows не обрабатывает аргументы командной строки так же, как Unix.) - person Keith Thompson; 10.04.2015
comment
@ChristopherBottoms: нет, это из стандартной библиотеки C; чтобы получить Perl5, вам понадобится Inline :: Perl5 - person Christoph; 11.04.2015
comment
@KeithThompson: нет, system ожидает единственный аргумент - в Windows вам понадобится функция _ 2_ family, чтобы избежать обработки - person Christoph; 11.04.2015
comment
Я искал shell и run, но упоминание NativeCall добавляет еще одно измерение к взаимодействию с операционной системой, которое я не рассматривал. Поэтому я отмечаю это как принятый ответ. Я по-прежнему рекомендую читателям также посмотреть мой ответ для быстрого shell и run обзора и примера. - person Christopher Bottoms; 28.04.2015

В Perl6 фактически есть две команды, которые заменяют system из Perl 5.

В Perl6 shell передает свой аргумент оболочке, аналогично system в Perl 5, когда он имеет один аргумент, содержащий метасимволы.

В Perl6 run пытается избежать использования оболочки. Он принимает свой первый аргумент как команду, а остальные аргументы как аргументы этой команды, аналогично Perl 5 system, когда он имеет несколько аргументов.

Например:

shell('ls > file.log.txt');   # Capture output from ls (shell does all the parsing, etc)

run('ls','-l','-r','-t');     # Run ls with -l, -r, and -t flags
run('ls','-lrt');             # Ditto

См. Также это 2014 Perl 6 Advent сообщение о "запущенных внешних программах".

person Christopher Bottoms    schedule 09.04.2015