我该如何在Perl 6中运行外部程序?(例如像Perl 5中的“system”一样)

5

我可以在Perl 5中使用system来运行外部程序。我喜欢把system看作是Perl内部的一个微型“Linux命令行”。然而,我找不到关于Perl 6中system的文档。它的等效语法是什么?

2个回答

9

Perl6实际上有两个命令可以替代Perl 5中的system

在Perl6中,shell将其参数传递给shell,类似于Perl 5的system当它有一个包含元字符的参数时。

在Perl6中,run尝试避免使用shell。它将第一个参数作为命令,并将其余参数作为该命令的参数,类似于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关于“运行外部程序”的文章


5
除了使用 shellrun 替代 Perl 5 中的 system,您还可以使用 NativeCall 调用 libc 的 system 函数。
在我的 Windows 计算机上,它看起来像这样:
use NativeCall;
sub system(Str --> int32) is native("msvcr110.dll") { * };
system("echo 42");

1
这个 system 基本上和 Perl 5 版本一样吗? - Christopher Bottoms
如果你必须指定 "msvcr110.dll",我认为它不是非常可移植的。你能像 Perl 5 的 system("echo" "42") 一样传递多个参数吗?(我知道 Windows 的命令行参数处理方式与 Unix 不同。) - Keith Thompson
1
@ChristopherBottoms:不,这是来自C标准库的;要获取Perl5的那个,你需要Inline::Perl5 - Christoph
1
@KeithThompson:不, system需要一个参数 - 在Windows上,您需要使用 _exec family中的函数来避免处理。 - Christoph
我一直在寻找shellrun,但提到NativeCall为与操作系统交互添加了另一个维度,这是我没有考虑过的。因此,我将其标记为被接受的答案。我仍然建议读者查看我的回答以获取快速的shellrun概述和示例。 - Christopher Bottoms

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接