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 的列表返回给出项目的计数,而不是列表 的相关文章

  • 使用 CPAN 强制安装模块

    我知道通过命令提示符使用 CPAN 来 强制 安装模块很容易 我试图通过脚本实现相同的目标 use CPAN eval use Filesys DiskSpace or do CPAN install Filesys DiskSpace 有
  • Perl 中的 Substr,将 utf8 字符切成两半

    我正在尝试解决使用时的问题substr在 Perl v5 8 5 中 这是一个示例字符串 UTF 8 示例 编辑 ff if length hit gt post title gt 60 hit gt post title substr h
  • 找到与另一个子集和匹配的最小子集和

    我有一个现实世界的问题 不是家庭作业 需要找到集合 A 的子集之和等于其他集合 B 的子集之和 一个非常相似的问题 有一个有用的答案is here https stackoverflow com questions 443712 algor
  • 我无法使用 LWP::UserAgent 连接到任何 HTTPS 站点

    我正在尝试创建一个仅连接到网站的脚本 但是 由于某种原因 它不会连接到使用 HTTPS 的任何内容 我们在这里启用了代理 但是 我相信代理不是问题 因为如果我要连接到网络内部不通过代理建立隧道的 HTTPS 它仍然会失败 如果我要在任何不使
  • 如何提高非持久 CGI 进程中的 Moose 性能?

    Moose http search cpan org dist Moose 是一个很棒的对象框架 问题在于 连同它的依赖项一起 它是very大的 我们的分析表明 在我们的平台上 仅加载 Moose 就会在非持久性 CGI 应用程序脚本上产生
  • 如何使用 JSON 和 Perl (HTML::Mason) 通过 AJAX 创建动态网页?

    我对处理 Javascript JSON 和 Peel 的方式感到有些困惑 而且大多数示例都是 PHP 语言 这对我没有帮助 我有一个页面 称为 main html 其中包含来自 MySQL 的数据 并且可以选择按 id 删除行 然后我让
  • 使用 Perl 进行数据签名

    我参与了这个涉及发送签名数据的项目 我已经获得了一个 pem 文件和一个服务器证书 我应该将其导入到另一台服务器 我应该使用这些文件对数据进行签名 然后将签名的数据发送到另一台服务器进行验证和处理 我的问题是 如何将这两个文件导入到我的服务
  • Perl 6:反式(%h) 与反式(%h.keys => %h.values)

    还有一个问题是关于hash作为论据trans 在下面的代码中简单地取hash给出了错误的结果 但将其替换为keys and values使其正确 怎么了 my alph1
  • Perl 使用什么哈希函数/算法?

    有人能解释一下 Perl 用于将字符串映射到索引的哈希函数 算法吗 有相关读物吗 这个答案早于 5 28 中进行的哈希函数更改 请参阅 默认哈希函数更改 perldelta 为 5 28 http perldoc perl org perl
  • DBI:在 eval 中引发错误

    这个问题参考了池上的评论 But if you re going to put an eval around every statement just use RaiseError gt 0 in this thread https sta
  • 使用perl求中位数、众数、标准差?

    我有一个数字数组 计算数据集的中位数 众数和标准差的最简单方法是什么 Statistics Basic Mean http p3rl org Statistics Basic Mean Statistics Basic Median htt
  • 在 Perl 中验证电子邮件的正则表达式

    我是 Perl 新手 正在尝试掌握脚本语言 其中我遇到了正则表达式来验证电子邮件地址 我正在分享 perl 脚本 我不确定我在哪里犯了错误 部分始终被省略 随后正确的电子邮件 ID 也显示为无效 这是代码 usrs bin perl str
  • 不区分大小写的关键字匹配

    我正在编写一种用于解析计算机语言的语法 可以与解析 Eyapp http search cpan org casiano Parse Eyapp 1 182 lib Parse Eyapp pod 这是一个 Perl 包 可以简化常规语言解
  • 当与不需要虚拟机的编译程序一起使用时,CGI 是否仍然很慢?

    当我学习 CGI 时 我了解到任何编程语言都可以用来将其输出挂钩到 http 响应消息 而它的输入是 http 请求消息 我读过的很多文章都在 Perl 的背景下讨论 CGI 这是因为 Perl 是与 CGI 结合使用的最常见的语言吗 我想
  • 是否可以使用perl读取pdf文件中的文本?

    我想在 perl 中解析 pdf 文件中的文本 而不将 pdf 转换为任何其他格式 是否可以 是的你可以 看看CAM PDF http search cpan org dist CAM PDF 包裹 您可以使用此模块来提取文本 my pdf
  • 我能否确保在 5.10+ 上编写的 Perl 代码可以在 5.8 上运行?

    Perl 5 10 和 5 12 的一些新功能 例如 say 被定义为功能 您可以使用 feature 编译指示显式启用或禁止这些功能 但其他添加 例如正则表达式的命名捕获组 是隐式的 当我使用 5 10 解释器编写 Perl 但希望它也能
  • 如何在 Perl 中取消导入函数?

    我正在尝试删除导入的符号 以便它们不能用作对象中的方法 但是no似乎不起作用 也许我不明白不 或者还有其他方法 use 5 014 use warnings use Test More still has carp after no car
  • 如何在 Perl 中使用数组引用中的索引作为方法引用?

    如同这个关于迭代子例程引用的问题 https stackoverflow com questions 452529 how do i iterate over dereference an array of subroutine refs
  • perl imap 将邮件移至垃圾箱 (Mail::IMAPClient)

    我需要将所有未见的邮件移至垃圾箱 然后从收件箱中删除 my inbox imap gt select Inbox my mails imap gt unseen foreach my msgid mails imap gt set flag
  • perl xs - 从 c 数组返回 perl 数组

    使用 XS 我尝试将值从 C 数组传递到可在脚本中使用的 Perl 数组 这是我的 xs 文件中的代码 AV DoubleArray getPerlArray CODE r newAV for size t i 0 i lt THIS gt

随机推荐