system - 如何在 Perl6 中制作模数?

标签 system raku modulino

我想做一个modulino (a file that can run as either a module or a script)在 Perl6 中。

以下代码从命令行“处理”文件名:

sub MAIN ( *@filenames )
{
    for @filenames -> $filename
    {
        say "Processing $filename";
    }
}

将其另存为 main.pm6 我可以运行它并且它可以工作:

perl6 main.pm6 hello.txt world.txt
Processing 'hello.txt'
Processing 'world.txt'

所以,我希望这是一个模块,以便我可以添加功能并使测试更容易。但是,当我向其添加 module 声明时,它不再输出任何内容:

module main;
sub MAIN ( *@filenames )
{
    for @filenames -> $filename
    {
        say "Processing '$filename'";
    }
}

这不会产生任何输出:

perl6 main.pm6 hello.txt world.txt

那么,如何在 Perl6 中构建 modulino?

我正在使用运行在 MoarVM 上的 Perl6来自January 2015 release of Rakudo Star .

更新:

当我尝试将模块包裹在大括号中时:

module main
{
    sub process (@filenames) is export
    {
        for @filenames -> $filename
        {
            say "Processing '$filename'";
        }
    }
};

sub MAIN ( *@filenames )
{
    process(@filenames)
}

我也收到错误:

===SORRY!=== Error while compiling main.pm6
Undeclared routine:
    process used at line 14. Did you mean 'proceed'?

最佳答案

MAIN 子组件需要在模块外部声明,但它仍然必须能够看到process

有多种方法可以实现这一点,例如根本不声明模块

sub process(@filenames) {
    for @filenames -> $filename {
        say "Processing '$filename'";
    }
}

sub MAIN(*@filenames) {
    process(@filenames);
}

通过使进程成为我们的范围并通过其长名称调用它

module main {
    our sub process(@filenames) {
        for @filenames -> $filename {
            say "Processing '$filename'";
        }
    }
}

sub MAIN(*@filenames) {
    main::process(@filenames);
}

或者通过导出process并将其导入MAIN的主体中

module main {
    sub process(@filenames) is export {
        for @filenames -> $filename {
            say "Processing '$filename'";
        }
    }
}

sub MAIN(*@filenames) {
    import main;
    process(@filenames);
}

在我看来,最合适的选择是将 MAIN 添加到模块并将其导入到脚本的主线中。这样,模块中声明的所有内容都在 MAIN 中可见,而无需显式导出所有内容:

module main {
    sub process(@filenames) {
        for @filenames -> $filename {
            say "Processing '$filename'";
        }
    }

    sub MAIN(*@filenames) is export(:MAIN) {
        process(@filenames);
    }
}

import main :MAIN;

请注意,默认情况下不会导出 MAIN,即模块的用户只有提供 :MAIN 标记才能获取它。

关于system - 如何在 Perl6 中制作模数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29281305/

相关文章:

python - 在 Windows 中禁用特定的 USB 端口

c - 在 C 上使用 sprintf 和系统函数时为空文件

raku - 如何声明一个接受类型化数组参数的函数

raku - 如果需要该文件,Perl 6 是否应该运行 MAIN?

java - 编写中/大型系统时的问题

c++ - 跨平台和语言插件系统

regex - Perl6 解析文件

compilation - Raku 程序编译和执行的顺序(可能是嵌套编译阶段?)

perl - 如何在 TextMate 中运行专为证明表单而设计的测试 perl 脚本?