Chr*_*oms 7 system perl6 modulino raku
我想在Perl6中创建一个modulino(一个可以作为模块或脚本运行的文件).
以下代码从命令行"处理"文件名:
sub MAIN ( *@filenames )
{
for @filenames -> $filename
{
say "Processing $filename";
}
}
Run Code Online (Sandbox Code Playgroud)
保存这个,因为main.pm6我可以运行它,它的工作原理:
perl6 main.pm6 hello.txt world.txt
Processing 'hello.txt'
Processing 'world.txt'
Run Code Online (Sandbox Code Playgroud)
所以,我希望这是一个模块,以便我可以添加功能并使测试更容易.但是,当我module向它添加一个声明时,它不再输出任何内容:
module main;
sub MAIN ( *@filenames )
{
for @filenames -> $filename
{
say "Processing '$filename'";
}
}
Run Code Online (Sandbox Code Playgroud)
这导致什么输出:
perl6 main.pm6 hello.txt world.txt
Run Code Online (Sandbox Code Playgroud)
那么,我如何在Perl6中构建modulino?
我从2015年1月发行的Rakudo Star中使用Perl6在MoarVM上运行.
当我尝试将模块包装在大括号中时:
module main
{
sub process (@filenames) is export
{
for @filenames -> $filename
{
say "Processing '$filename'";
}
}
};
sub MAIN ( *@filenames )
{
process(@filenames)
}
Run Code Online (Sandbox Code Playgroud)
我也得到错误:
===SORRY!=== Error while compiling main.pm6
Undeclared routine:
process used at line 14. Did you mean 'proceed'?
Run Code Online (Sandbox Code Playgroud)
该MAIN子需要的模块之外声明,但它仍然必须能够看到process.
有多种方法可以实现这一点,例如,根本不要声明模块
sub process(@filenames) {
for @filenames -> $filename {
say "Processing '$filename'";
}
}
sub MAIN(*@filenames) {
process(@filenames);
}
Run Code Online (Sandbox Code Playgroud)
通过使用process我们的作用域并通过其长名称调用它
module main {
our sub process(@filenames) {
for @filenames -> $filename {
say "Processing '$filename'";
}
}
}
sub MAIN(*@filenames) {
main::process(@filenames);
}
Run Code Online (Sandbox Code Playgroud)
或者通过process在体内输出和导入它MAIN
module main {
sub process(@filenames) is export {
for @filenames -> $filename {
say "Processing '$filename'";
}
}
}
sub MAIN(*@filenames) {
import main;
process(@filenames);
}
Run Code Online (Sandbox Code Playgroud)
在我看来,最合适的选择是添加MAIN到模块并将其导入脚本的主线.这样,模块中声明的所有内容都可以在MAIN其中显示,而无需显式导出所有内容:
module main {
sub process(@filenames) {
for @filenames -> $filename {
say "Processing '$filename'";
}
}
sub MAIN(*@filenames) is export(:MAIN) {
process(@filenames);
}
}
import main :MAIN;
Run Code Online (Sandbox Code Playgroud)
请注意,MAIN默认情况下不会导出,即模块的用户只有在提供:MAIN标记时才会获取.