我如何在 Perl6 中制作模数?
How do I make a modulino in Perl6?
我想用 Perl6 做一个 modulino (a file that can run as either a module or a script)。
以下代码"processes" 来自命令行的文件名:
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 中构建模数?
我在 MoarVM from the January 2015 release of Rakudo Star.
上使用 Perl6 运行ning
更新:
当我尝试用大括号包裹模块时:
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
sub 需要在模块外声明,但它仍然必须能够看到 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
标签时才会获得它。
我想用 Perl6 做一个 modulino (a file that can run as either a module or a script)。
以下代码"processes" 来自命令行的文件名:
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 中构建模数?
我在 MoarVM from the January 2015 release of Rakudo Star.
上使用 Perl6 运行ning更新:
当我尝试用大括号包裹模块时:
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
sub 需要在模块外声明,但它仍然必须能够看到 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
标签时才会获得它。