【问题标题】:Cannot import Perl5 module using Inline::Perl5 into Perl6无法使用 Inline::Perl5 将 Perl5 模块导入 Perl6
【发布时间】:2019-06-26 11:32:10
【问题描述】:

我正在尝试导入一个我非常喜欢 https://metacpan.org/pod/Data::Printer 的 Perl5 模块 使用手册页中的建议 https://modules.perl6.org/dist/Inline::Perl5:cpan:NINE

使用非常简单的脚本

use Inline::Perl5;
my $p5 = Inline::Perl5.new;
$p5.use('Data::Printer');

然后我得到这个错误:

Unsupported type NativeCall::Types::Pointer<94774650480224> in p5_to_p6
  in method p5_to_p6_type at /usr/lib/perl6/site/sources/130449F27E85303EEC9A19017246A5ED249F99E4 (Inline::Perl5) line 298
  in method unpack_return_values at /usr/lib/perl6/site/sources/130449F27E85303EEC9A19017246A5ED249F99E4 (Inline::Perl5) line 375
  in method invoke at /usr/lib/perl6/site/sources/130449F27E85303EEC9A19017246A5ED249F99E4 (Inline::Perl5) line 446
  in method import at /usr/lib/perl6/site/sources/130449F27E85303EEC9A19017246A5ED249F99E4 (Inline::Perl5) line 776
  in method use at /usr/lib/perl6/site/sources/130449F27E85303EEC9A19017246A5ED249F99E4 (Inline::Perl5) line 898
  in block <unit> at inline_perl5.p6 line 4

这里出了什么问题?如何将此 perl5 模块导入 perl6?如果有一种类似的方法可以在 Perl6 中获取彩色/选项卡式输出,就像我从 Data::Printer 获得的那样,我也会很高兴,因为我找不到它。

编辑:这里解决了:how to load Perl5's Data::Printer in Perl6?

【问题讨论】:

    标签: raku


    【解决方案1】:

    我认为您偶然发现了 Inline::Perl5 中的一个错误,该错误似乎发生在 Data::Printer Perl 5 模块中,因此我建议您在 https://github.com/niner/Inline-Perl5/issues 上为它打开一个问题。

    与此同时,语法变得更加简单。一旦您安装了Inline::Perl5,您只需添加:from&lt;Perl5&gt; 副词即可从 Perl 5 加载模块:

    use Data::Printer:from<Perl5>;
    

    不幸的是,此时会产生与您已经描述的相同的错误:

    ===SORRY!===
    Unsupported type NativeCall::Types::Pointer<140393737675456> in p5_to_p6
    

    所以我认为没有不需要升级 Inline::Perl5 或 Rakudo Perl 6 的解决方案。

    【讨论】:

    • 我已将问题添加到 GitHub,感谢您告诉我。如果有人在那里解决它,如果给出解决方案,我会重新发布解决方案
    【解决方案2】:

    来自 github 页面,https://github.com/niner/Inline-Perl5/issues/128

    > perl6 -Ilib -e 'use Data::Printer:from<Perl5>; my @a = 1, 2, [3, 4, ${a => 1}]; p @a'
    [
        [0] 1,
        [1] 2,
        [2] [
            [0] 3,
            [1] 4,
            [2] {
                a   1
            } (tied to Perl6::Hash)
        ]
    ]
    

    不过,我对此并不特别满意。这比 perl5 要复杂得多。在 Perl5 上使用 Perl6 的要点之一是更简单的使用和语法。这不是。 'Inline::Perl5' 模块应该能够像其他所有模块一样在脚本中加载,而不是作为命令行选项。

    【讨论】:

    • 那一行只是 Niner 快速演示修复的方式。他不会意识到你是 P6 新手。您可以直接以脚本形式编写它:use lib 'lib'; use Data::Printer:from&lt;Perl5&gt;; ... 其中lib 是您的 P5 库的安装目录。
    • 感谢您尝试这个,提出您的 SO 问题,并在 IP5 存储库上发布问题。通过耐心地参与这个级别,您只是为 P6 做出了重大贡献。 :) 此外,现在您知道您可以像在 P6 中一样使用许多 P5 模块,如果它们不起作用,您可以通过发布问题来为 P6 的改进做出贡献,在某些情况下,几天或几周后会有修复有时一天之内。 :)
    • 锦上添花的是,还有其他语言的other similar language adaptors(尽管它们目前不如 IP5 适配器抛光)。所以如果你不能以 P6 模块的形式得到你想要的东西,你可以寻找一个 P5 模块,如果这不能解决问题,你可以使用许多 Python 模块、Ruby gems、C 库,... P6是强力胶。 :)
    • 呃,use lib 'lib'; 是针对 P6 模块的。如果您想从“lib”目录加载 P5 模块,而不是(或者?我无法测试这个 atm)目录 IP5 默认从加载 P5 模块,那应该是 use lib:from&lt;Perl5&gt; 'lib';
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-11
    • 2023-02-03
    • 2019-06-29
    • 2015-08-03
    • 2019-07-03
    • 2013-04-25
    • 1970-01-01
    相关资源
    最近更新 更多