rai*_*iph 8 tags import perl module raku
我在 Perl 中使用了 CPAN Perl 模块 Data::Printer (DP)。它工作得很好。
现在我想在 Raku 代码中使用它。
当我使用该:from<Perl5>功能导入它然后使用它运行代码时,注释(tied to Perl6::Hash)会附加到哈希的显示中。1
正如DP 的 CPAN 文档所示,此注释由选项控制show_tied。我想将其关闭(设置为0)而不是默认开启(设置为1)。这是我在 Perl 中的做法:
use Data::Printer show_tied => 0;
Run Code Online (Sandbox Code Playgroud)
但是当我在 Raku 中尝试这个时:
use Data::Printer:from<Perl5> show_tied => 0;
Run Code Online (Sandbox Code Playgroud)
我得到:
从“Data::Printer”导入时出错:没有这样的标签“show_tied”
show_tied在 Raku 中使用 DP 时如何关闭?
1也许这是因为Inline::Perl5(实现该:from<Perl5>功能)正在做一些事情来实现流畅的 Perl/Raku 互操作。
show_tied在 Raku 中使用 DP 时如何关闭?
您必须显式地将语句末尾列出的不是“标签”的Associatives(例如Pairs)转换为交错键和值的扁平列表。1use
最直接的解决方案是手动编写一个平面的文字列表,例如:
use Data::Printer:from<Perl5> 'show_tied', 0;
Run Code Online (Sandbox Code Playgroud)
有关更简洁的解决方案,请参阅下面的使用kv部分。
请注意,use语句是在编译时评估的。因此,如果您想在列表中注入变量,那么您需要确保它们的值,而不仅仅是它们的名称,也在编译时,在use评估语句之前建立。朴素是my $foo = 0;不够的,因为该= 0部分将在运行时发生。相反,您需要使用合适的编译时构造,例如BEGIN:
BEGIN my $foo = 0;
use Data::Printer:from<Perl5> 'show_tied', $foo;
Run Code Online (Sandbox Code Playgroud)
kv给定散列,该kv例程可以生成所需的'key1', value1, 'key2', value2, ...序列:
use Data::Printer:from<Perl5> kv { show_tied => 0 }
Run Code Online (Sandbox Code Playgroud)
或者:
BEGIN my %opts = show_tied => 0;
use Data::Printer:from<Perl5> kv %opts;
Run Code Online (Sandbox Code Playgroud)
1这个答案建立在 Stefan 的解释之上,我在回应“在 Raku 中更改 Data::Printer 中的参数”而打开的问题中,所以:
解决方案相当简单:使用
Data::Printer:from<Perl5> 'show_tied', 0;胖逗号在 Raku 中=>是一个Pair构造函数,而在 Perl 5 中它实际上只是一个花哨的逗号。Raku 认为Pair参数用于导入标签:ALL(相当于ALL => True)。为了解决这个问题并传递 Perl 5 代码所期望的,只需单独列出这些值。
换句话说,这需要进行转换,因为Perl和乐共享概念的标签(Perl的文档有关的“标签” ;乐商务部关于“标签”)和(并不是巧合)惯用用于选择标签相同的语法(:tagname)。
此外,使用 Raku,这个(需要解决的)语法是否用于指定标签之间的歧义问题适用于在语句的顶层使用的所有 Associatives use,不仅是写在表单中的:foo,甚至是写成的在其它形式,例如foo => bar,{ foo => bar},%baz,或{ %baz }。
| 归档时间: |
|
| 查看次数: |
115 次 |
| 最近记录: |