一些简单的 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