gpt4 book ai didi

raku - 在 bin/中创建包含 Perl 5 实用程序脚本的 Perl 6 模块

转载 作者:行者123 更新时间:2023-12-04 21:06:02 27 4
gpt4 key购买 nike

Perl 5 模块分发中的 Perl 6 脚本

我可以在 Perl 5 模块分发中包含一个 Perl 6 脚本:

# Create a new module
dzil new My::Dist
cd My-Dist/

# Add necessary boilerplate
echo '# ABSTRACT: boilerplate' >> lib/My/Dist.pm

# Create Perl 6 script in bin directory
mkdir bin
echo '#!/usr/bin/env perl6' > bin/hello.p6
echo 'put "Hello world!";' >> bin/hello.p6

# Install module
dzil install

# Test script
hello.p6
# Hello world!

# See that it is actually installed
which hello.p6
# ~/perl5/perlbrew/perls/perl-5.20.1/bin/hello.p6

Perl 6 模块分发中的 Perl 5 脚本

但是,我很难在 Perl 6 发行版中包含 Perl 5 脚本。

在模块目录中有一个 META6.json文件和一个名为 bin 的子目录.在 bin是一个名为 hello.pl 的 Perl 5 文件.
zef install .在顶层目录中运行没有错误。但是当试图运行 hello.pl ,我得到一个错误。来看看,已经为 hello.pl 安装了一个 Perl 6 包装脚本这就是给我错误的原因。如果我运行原始 hello.pl直接,它工作正常。
META6.json
{
"perl" : "6.c",
"name" : "TESTING1234",
"license" : "Artistic-2.0",
"version" : "0.0.2",
"auth" : "github:author",
"authors" : ["First Last"],
"description" : "TESTING module creation",
"provides" : {
},
"depends" : [ ],
"test-depends" : [ "Test", "Test::META" ]
}
bin/hello.pl
#!/usr/bin/env perl
use v5.10;
use strict;
use warnings;

say 'Hello world!';

这安装没有错误,但是当我尝试运行 hello.pl ,我收到以下错误:

===SORRY!===
Could not find Perl5 at line 2 in:
/home/username/.perl6
/path/to/perl6/rakudo-star-2017.07/install/share/perl6/site
/path/to/perl6/rakudo-star-2017.07/install/share/perl6/vendor
/path/to/perl6/rakudo-star-2017.07/install/share/perl6
CompUnit::Repository::AbsolutePath<64730416>
CompUnit::Repository::NQP<43359856>
CompUnit::Repository::Perl5<43359896>

which hello.pl从命令行显示它安装在 /path/to/perl6/rakudo-star-2017.07/install/share/perl6/site/bin/hello.pl .该文件实际上是以下代码:
/path/to/perl6/rakudo-star-2017.07/install/share/perl6/site/bin/hello.pl
#!/usr/bin/env perl6
sub MAIN(:$name is copy, :$auth, :$ver, *@, *%) {
CompUnit::RepositoryRegistry.run-script("hello.pl", :dist-name<TESTING1234>, :$name, :$auth, :$ver);
}

我提交了 Rakudo 错误报告 ( https://rt.perl.org/Ticket/Display.html?id=131911),但我并不完全相信没有简单的解决方法。

最佳答案

例如,我创建了一个简单的 cat在 Perl 5 中替换并创建了一个“包裹”它的 Perl 6 模块(如果您想下载代码并自己尝试,请参阅 GitHub repository for it)。

以下是相关文件的副本。创建这些文件后,运行 zef install .使用我的 Rakudo Star 2017.07 安装可以正常安装。这将安装 run_cat在 Rakudo bin 中可执行目录。

似乎 secret 是制作一个 Perl 6 模块文件来包装 Perl 5 脚本和一个相应的 Perl 6 脚本来使用 Perl 6 模块。

Perl 5 脚本
resources/scripts/cat.pl

#!/bin/env perl
use v5.10;
use strict;
use warnings;

while(<>) {
print;
}

包装脚本

模块: lib/catenate.pm6
unit module catenate;

sub cat ($filename) is export {
run('perl',%?RESOURCES<scripts/cat.pl>,$filename);
}

可执行文件: bin/run_cat
#!/bin/env perl6
use catenate;

sub MAIN ($filename) {
cat($filename);
}

样板和测试

META6.json`
{
"perl" : "6.c",
"name" : "cat",
"license" : "Artistic-2.0",
"version" : "0.0.9",
"auth" : "github:author",
"authors" : ["First Last"],
"description" : "file catenation utility",
"provides" : { "catenate" : "lib/catenate.pm6" },
"test-depends" : [ "Test", "Test::META" ],
"resources" : [ "scripts/cat.pl" ]
}
t/cat.t
#!/bin/env perl6
use Test;

constant GREETING = 'Hello world!';
my $filename = 'test.txt';
spurt($filename, GREETING);

my $p5 = qqx{ resources/scripts/cat.pl $filename };
my $p6 = qqx{ bin/run_cat $filename };

is $p6, $p5, 'wrapped script gives same result as original';

is $p6, GREETING, "output is '{GREETING}' as expected";

unlink $filename;

done-testing;

感谢@moritz 和@ugexe 让我指出了正确的方向!

关于raku - 在 bin/中创建包含 Perl 5 实用程序脚本的 Perl 6 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45721021/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com