7

我想在 Perl6 中制作一个modulino(一个可以作为模块或脚本运行的文件)

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

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 中构建模数?

我正在使用从2015 年 1 月发布的 Rakudo Star开始在MoarVM上运行的 Perl6 。

更新:

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

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'?
4

1 回答 1

8

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

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

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

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

通过制作process我们的范围并用它的长名来调用它

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标签时才能获得它。

于 2015-03-26T16:28:16.423 回答