系统交互

通过命令行获取参数

最简单的方法是使用 @*ARGS 变量从命令行获取参数;此数组将包含程序名称后面的字符串。 %*ENV 将包含环境变量,因此如果您使用:

  1. export API_KEY=1967196417966160761fabc1511067
  2. ./consume_api.p6

您可以通过以下方式在程序中使用它们:

  1. my $api-key = %*ENV<API_KEY> // die "Need the API key";

如果先前未定义环境变量 API_KEY,则此操作将失败。

Raku 有一个更好的方法来处理命令行参数,如果它们代表文件名:那么使用 $*ARGFILES 动态变量。

  1. for $*ARGFILES.lines -> $l {
  2. say "Long lines in {$*ARGFILES.path}"
  3. if $l.chars > 72 ;
  4. }

例如,你可以用 argf​​iles.p6 *.p6 的方式运行这个程序,每次找到一个超过72个字符的行时,它就会打印一个文件名。 $*ARGFILES 包含命令行中描述的所有文件的文件句柄 - .lines 将依次读取每行文件的一行,每次处理新句柄时都会更改 $*ARGFILES.path 的值。通常,它为处理文件集的脚本提供了非常方便的 API。

以交互方式获取参数

使用 prompt 让一个正在运行的程序向用户查询数据:

  1. my UInt $num-iters = prompt "How many iterations to run: ";

同步和异步运行程序

运行外部程序有两个例程:runshell。两者都存在于 IO 角色中,因此包含在混合该角色的所有类中,如 IO::Path。两者都返回一个 Proc 对象,但主要区别在于 run 会尽可能避免系统 shell,而 shell 会通过默认系统 shell 运行命令。

运行所有外部程序的关键类是 Proc::Async,它以异步方式运行进程,并允许与正在运行的进程进行并发交互。通常,通过这些高级抽象接口与系统进行交互是一种很好的做法。但是,Raku 提供了通过低级接口与系统交互的其他方式。

通过原生 API 进行操作系统调用

NativeCall 可用于与系统库以及任何其他可访问库进行交互。这个link:(简短的教程)解释了,例如,如何使用该接口调用系统函数,如 getaddrinfo;通过使用 NativeCall 接口的声明,也可以通过这种方式访问​​其他一些函数,例如 kill

幸运的是,您不必为所有原生功能执行此操作。作为将 Perl 5 作为生态系统的一部分移植到 Raku 的蝴蝶项目的一部分,Elizabeth Mattijsen 正在将许多系统功能移植到 P5getprotobyname 等模块中,这些功能包括 endprotoentgetprotoentgetprotobyname 等功能。 getprotobynumbersetprotoent。如果要使用p6y形式的那些功能,请搜索并安装P5模块