系统交互
通过命令行获取参数
最简单的方法是使用 @*ARGS
变量从命令行获取参数;此数组将包含程序名称后面的字符串。 %*ENV
将包含环境变量,因此如果您使用:
export API_KEY=1967196417966160761fabc1511067
./consume_api.p6
您可以通过以下方式在程序中使用它们:
my $api-key = %*ENV<API_KEY> // die "Need the API key";
如果先前未定义环境变量 API_KEY
,则此操作将失败。
Raku 有一个更好的方法来处理命令行参数,如果它们代表文件名:那么使用 $*ARGFILES
动态变量。
for $*ARGFILES.lines -> $l {
say "Long lines in {$*ARGFILES.path}"
if $l.chars > 72 ;
}
例如,你可以用 argfiles.p6 *.p6
的方式运行这个程序,每次找到一个超过72个字符的行时,它就会打印一个文件名。 $*ARGFILES
包含命令行中描述的所有文件的文件句柄 - .lines
将依次读取每行文件的一行,每次处理新句柄时都会更改 $*ARGFILES.path
的值。通常,它为处理文件集的脚本提供了非常方便的 API。
以交互方式获取参数
使用 prompt
让一个正在运行的程序向用户查询数据:
my UInt $num-iters = prompt "How many iterations to run: ";
同步和异步运行程序
运行外部程序有两个例程:run
和 shell
。两者都存在于 IO
角色中,因此包含在混合该角色的所有类中,如 IO::Path。两者都返回一个 Proc 对象,但主要区别在于 run
会尽可能避免系统 shell,而 shell
会通过默认系统 shell 运行命令。
运行所有外部程序的关键类是 Proc::Async,它以异步方式运行进程,并允许与正在运行的进程进行并发交互。通常,通过这些高级抽象接口与系统进行交互是一种很好的做法。但是,Raku 提供了通过低级接口与系统交互的其他方式。
通过原生 API 进行操作系统调用
NativeCall
可用于与系统库以及任何其他可访问库进行交互。这个简短的教程解释了,例如,如何使用该接口调用系统函数,如 getaddrinfo
;通过使用 NativeCall 接口的声明,也可以通过这种方式访问其他一些函数,例如 kill
。
幸运的是,您不必为所有原生功能执行此操作。作为将 Perl 5 作为生态系统的一部分移植到 Raku 的蝴蝶项目的一部分,Elizabeth Mattijsen 正在将许多系统功能移植到 P5getprotobyname
等模块中,这些功能包括 endprotoent
,getprotoent
,getprotobyname
等功能。 getprotobynumber
和 setprotoent
。如果要使用p6y形式的那些功能,请搜索并安装P5模块。