Inline::Perl5 的列表返回给出项目的计数,而不是列表

2024-02-18

一些简单的 Inline::Perl5 代码返回一个列表,但它似乎返回项目的计数而不是实际的列表。

更改涉及的项目数量会更改计数。

use Inline::Perl5;                                             
my $p5 = Inline::Perl5.new;                                    
                                                               
my $perl5_code = q:to/END/;                                    
   sub p5_data {                                               
      my @monsters = qw( godzilla blob tingler kong dorisday );
      return @monsters;                                        
   }                                                           
                                                               
   p5_data();                                                  
END                                                            
                                                               
my @stuff = $p5.run: $perl5_code;                              
say @stuff; # [5]                                              

我以为我会得到存储在数组中的字符串列表,但它的行为就像是将其切换到标量上下文一样。

Update:

ikeami 指出,将引用返回到效果更好 数组:

return \@monsters;

不过,最后你会在第一个元素中得到一个数组 @stuff 数组,当你这样做时:

my @stuff = $p5.run: $perl5_code;                              

另一种方法(通过阅读 Inline::Perl5 文档)是在执行$p5.run定义 perl5 子程序,从 perl6 调用它:

my @stuff = $p5.call('p5_data');  

然后列表返回(return @monsters;)被加载到 数组如我所料:

[godzilla blob tingler kong dorisday]

这是最近安装的 Inline::Perl5 版本 0.40,位于 “Rakudo Star 版本 2019.03.1 构建于 MoarVM 版本 2019.03 之上,实现 Perl 6.d”。

Update2:因此,“run”似乎意味着标量上下文,“call”是一个列表上下文。

use Inline::Perl5;
my $p5 = Inline::Perl5.new;

my $perl5_defsub = q:to/END/;
   sub whadaya_want {
       wantarray() ? 'LIST' : 'SCALAR';
   }
END

$p5.run: $perl5_defsub;

my $run_context  = $p5.run(  'whadaya_want' );
my $call_context = $p5.call( 'whadaya_want' );  

say "run: ", $run_context;
say "call: ", $call_context;
# run: SCALAR
# call: LIST

Moritz 的回答非常出色,解释了 IP5 的困境。但 niner 很巧妙,因此 IP5 提供了人们需要的所有变化:


  • 调用 Perlsub in list语境:

    Inline::Perl5.new.call: 'subname', arg1, arg2 ...
    

    See IP5:调用 Perl 函数 https://github.com/niner/Inline-Perl5#call-a-perl-5-function.


  • 调用 Perlsub in scalar语境:

    Inline::Perl5.new.run: 'subname arg1, arg2 ...'
    

    or

    EVAL 'subname arg1, arg2 ...', :lang<Perl5>
    

    See IP5:运行任意 Perl 代码 https://github.com/niner/Inline-Perl5#run-arbitrary-perl-5-code.


  • 调用 Perlmethod in list语境:

    使用常规 Raku 语法:

    $perl-object .foo: arg1, arg2 ...
    

    打电话给foo保存在 Perl 对象上的方法$perl-object通过它arg1 and arg2作为它的前两个参数(忽略调用者)。

    See IP5:调用 Perl 对象上的方法 https://github.com/niner/Inline-Perl5#invoke-a-method-on-a-perl-5-object.


  • 调用 Perlmethod in scalar语境:

    使用常规 Raku 语法但插入Scalar作为第一个位置参数(忽略调用者):

    $perl-object .foo: Scalar, arg1, arg2 ...
    

    打电话给foo保存在 Perl 对象上的方法$perl-object通过它arg1 and arg2作为它的前两个参数。

    IP5 删除了Scalar在调用 Perl 方法之前。

    See IP5:在标量上下文中调用方法 https://github.com/niner/Inline-Perl5#invoking-a-method-in-scalar-context.


处理内联

我认为莫里茨的回答是对这个问题的可靠解决,我的回答已经解决了这个问题。

但是,如果您正在阅读本文并且对其他内联问题感兴趣或正在处理其他内联问题怎么办?

各部分开始于使用外语适配器时会发生什么 of 我的回答Raku:获取 Perl 模块的数组引用 https://stackoverflow.com/a/54768361/1077672试图概述一个关于 Raku 的 Inlines 的预期结果以及如何处理问题的迷你通用指南。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Inline::Perl5 的列表返回给出项目的计数,而不是列表 的相关文章

随机推荐