返回具有单个元素的数组或列表时的列表或标量上下文

2024-04-02

我有一个函数func可以返回单个值或值列表,具体取决于函数的调用方式。因此,对于这个特定的函数,调用者会知道何时只期望一个返回值,因此希望使用更简单的语法my $var = func( ... )代替my ($var) = func( ... )。问题是,在某些情况下,单个值会转换为具有一个元素的列表/数组的大小,而在某些情况下则不会。例如:

use feature qw(say);
use strict;
use warnings;

for (1..4) {
    no strict 'refs';
    my $a = &{"func".$_}();
    say $a;
}

sub func1 {
    return ("Hi");
}

sub func2 {
    my @a = ("Hi");
    return @a;
}

sub func3 {
    my @a = ("Hi");
    return (@a);
}

sub func4 {
    my @a = ("Hi");
    return (pop @a);
}

给出输出:

Hi
1
1
Hi

为什么在某些情况下我会得到 1"Hi"在其他情况下?


返回表达式在与函数本身相同的上下文中计算。Here http://www.perlmonks.org/?node_id=347416是一个非常全面的列表,列出了标量上下文中返回内容的内容。

正如它适用于此:

  • func1: 字符串文字不关心上下文。"Hi"计算结果为字符串Hi, so func1回报Hi.

  • func2:在标量环境中,@a计算结果为元素的数量@a, so func2回报1.

  • func3:在标量环境中,@a计算结果为元素的数量@a, so func3回报1.

  • func4: pop不关心上下文。pop(@a)计算结果为删除的元素(或 undef,如果@a是空的),所以func4回报Hi.

请注意,括号只是覆盖优先级,这对您的任何示例都没有影响。

You want

sub func {
   my @a = ...;
   return wantarray ? @a : $a[-1];
}

如果您想聪明一点,您还可以使用以下内容,因为标量上下文中的切片会返回列表上下文中返回的最后一个元素:

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

返回具有单个元素的数组或列表时的列表或标量上下文 的相关文章

  • 如何对 Data::Dumper 的输出进行排序?

    我想转储对象和散列的值 但它总是乱序打印键 如何按 递归 排序顺序转储键 use Data Dumper print Dumper obj Set Data Dumper Sortkeys 1获取 Perl 的默认排序顺序 如果要自定义顺序
  • 有没有办法匹配任意 Unicode 字母字符?

    我有一些文档经过 OCR 从 PDF 转换为 HTML 因此 他们最终会出现很多随机的 unicode 标点符号 而转换器会搞砸 即省略号等 他们还正确地有一堆非英语但仍然是字母字符 如 和俄语字符等 有没有办法制作一个匹配任何 unico
  • grep 两个分隔符之间的子字符串

    我有很多bash使用的脚本perl内的表达式grep为了提取两个分隔符之间的子字符串 例子 echo BeginMiddleEnd grep oP lt Begin End 问题是 当我将这些脚本移植到运行的平台时busybox 融合的 g
  • 在 Windows 7 中使用 ActivePerl @ARGV 为空

    我有以下 Perl 脚本 我正在尝试使用 ActivePerl 在 Windows 7 中运行它 c Perl64 bin perl exe w use strict my mp3splt exe c Program Files x86 m
  • 检查一个数字是 int 还是 float

    在perl中 我想检查给定变量是否包含浮点数 为了检查我正在使用的 my Var 0 02 Floating point number if int Var Var floating point number 但上面的代码对于 0 0 不起
  • 客户端浏览器关闭时服务器端 Perl CGI 脚本中断

    我已经尝试解决一个小问题很长一段时间了 但似乎我无法解决 我编写了一个 HTML 页面 它在提交表单时调用 perl CGI 脚本 该 CGI 在服务器端执行一定数量的任务 我让脚本将这些任务的步骤打印到 HTML 页面上的 iframe
  • 快速 Perl signint 处理程序

    收到 Ctrl C 时处理程序清理的最方便 最清晰的方法是什么 例如 当我的套接字服务器以这种方式被终止时 TCP 套接字永远不会关闭 我想要一个很好的衬里 我可以将其放在程序的顶部来设置 sigint 处理程序 或类似 atexit 的东
  • 为什么我的 Apache2::Log 输出用 \n 替换换行符?

    我在 apache2 mod perl 下设置了多个虚拟主机 我用的是ErrorLog指令为每个虚拟主机获取单独的错误日志 仅当我使用 Apache2 Log 时 这才按预期工作 警告 只会记录到常规错误日志中 这样就可以了 最后 但还存在
  • BASH:将数据从平面文件导入模板

    我有一个平面记录文件 每行有 33 行 我需要将此文件格式化为模板中的规格 模板为 DOS 格式 源文件为 NIX 格式 该模板具有必须遵守的特定缩进和间距 我想到了几个选择 BASH 与经典的 nix 工具 sed awk grep 等
  • 如何彻底删除 Perl 中的包?

    如何在 Perl 中彻底删除一个包 这不仅意味着包变量 还意味着 Perl 更新以处理继承更改和其他事情的任何魔术表 这个简单的测试 use warnings use strict use Test LeakTrace use Symbol
  • 我可以在 Perl 中访问动态指定类中的静态方法吗?

    是否可以在 Perl 中动态指定一个类并访问该类中的静态方法 这不起作用 但说明了我想做的事情 use Test Class1 my class Test Class1 class static method 我知道我可以这样做 class
  • 从函数返回哈希值的最佳 Perl 实践是什么?

    我正在考虑将哈希引用传递给函数或从函数返回数据的最佳实践 一方面 仅将输入值传递给函数并仅返回输出变量似乎很直观 然而 在 Perl 中传递哈希值只能通过引用来完成 因此有点混乱 而且似乎更有可能犯错误 另一种方法是在输入变量中传递引用 但
  • 打印出匿名子程序的代码

    我目前正在一个非常复杂的 Perl 架构中工作 我想创建一些调试工具 由于许多行为涉及匿名子例程 因此我想分析其中一些行为 而我所要做的就是对子例程的引用 简而言之 有没有办法打印子例程引用的代码 因为 Perl 被解释 它可能仍然可用 核
  • 如何检测FTP文件传输完成?

    我正在编写一个脚本 用于轮询 FTP 站点上的文件并在可用时将它们下载到本地 文件由各个来源方随机存放到 FTP 站点 我需要一种方法能够在下载之前检测 FTP 站点上的文件是否已被源方完全传输 关于如何解决这个问题有什么想法吗 如果您可以
  • 在哪里可以找到将现有 CPAN 模块转换为使用 Dist::Zilla 的简明指南?

    我曾多次阅读过相关文档和一些博客文章地区 齐拉 http search cpan org dist Dist Zilla 我从来没有对自己的理解充满信心 在回答另一个问题时 Ether 提出了转换的可能性地穴 SSLeay http sea
  • Perl:管理 Windows 上的路径编码

    我正在努力处理包含非英文字符的路径 Activestate Perl Windows XP 如何打开 写入 复制等位于包含希腊语 俄语 法语重音字符的路径中的文件 假设我要将 text txt 文件复制到的目录是 C Documents a
  • 如何在 Perl 中找到正则表达式匹配的位置?

    我需要编写一个接收字符串和正则表达式的函数 我需要检查是否有匹配并返回匹配的开始和结束位置 正则表达式已经由qr 该函数还可能收到一个 全局 标志 然后我需要返回所有匹配的 开始 结束 对 我无法更改正则表达式 甚至无法添加 用户可能使用的
  • 使用“严格引用”时不能使用字符串作为 ARRAY 引用

    我正在尝试执行下面提到的代码并观察到错误 在使用 严格引用 时 无法使用字符串 RCSoWLAN ePDG 2 Qguest ASUS ATT 作为 ARRAY 引用 Perl代码 perl64 bin perl use strict us
  • 如何 grep 遍历数组,同时过滤掉匹配项?

    有没有一种快速简便的方法来 grep 遍历数组 找到满足某些测试的元素and从原始数组中删除这些 例如我想要 a 1 7 6 3 8 4 b grep filter gt 5 a now b 7 6 8 and a 1 3 4 换句话说 我
  • 导入 .pl 文件

    我想知道如何将 Perl 文件导入到脚本中 我尝试了 use require 和 do 但似乎没有什么对我有用 这就是我用 require 做到的 usr bin perl require equations print x1 n 是否可以

随机推荐

  • 行动委托的协变和逆变

    我被困住了 为什么这不起作用 var childAction new Action
  • Android - Textview 在状态改变时改变颜色

    如何在 TextView 的各种状态 聚焦 按下 启用 上应用颜色 我已经提到过这一点 http developer android com reference android content res ColorStateList html
  • Ruby - 解析通过 URL 传入的 JSON

    我正在使用 javascript 将 JSON 对象发送到 ruby 但我无法在那里解析它 我尝试了以下内容 但没有运气 我也已经四处寻找了一段时间 但找不到任何有用的东西 请注意 我是一个非常新的红宝石 我的试验 def initiali
  • 在C#中优化多重调度通知算法?

    抱歉 我想不出更好的方法来描述这个问题 基本上 我正在尝试在游戏中实现碰撞系统 我希望能够注册一个 碰撞处理程序 来处理可以转换为特定类型的两个对象 以任一顺序给出 的任何碰撞 因此 如果Player Ship Entity and Las
  • 在 MATLAB 中翻转 y 轴

    有没有办法在matlab图中将y轴颠倒 使y轴的正方向而不是向上 指向下 我求求你了 请不要说 打印出来 然后把纸翻过来 The YDir 轴属性 https www mathworks com help matlab ref axes p
  • mysqldump 命令的 Windows 批处理文件

    这是我第一次制作 Windows 批处理文件 我不想先做实验 因为它与实时服务器相关 我用以下方式备份 mySql 数据库 打开命令提示符 写 mysqldump u user p DBname gt C DBname sql 然后cmd询
  • 是否可以从特定参数继承文档?

    Visual Studio 2017 ReSharper 2017 C 项目 我试图通过使用继承方法参数的文档select属性 但它似乎没有按预期工作 根据这篇文章 http tunnelvisionlabs github io SHFB
  • 如何查询5米范围内的所有数据?

    我正在使用 GeoDjango 和 PostGIS 然后我遇到了如何查询我的 postgres db 表以获取 5 米距离内的所有数据的麻烦 UPDATES1我正在使用 GeoDjango 1 2 7 我从这个网址找到了一些东西https
  • 使用 JAXB Marshaller 处理 XML 转义字符(例如引号)

    我需要使用 JAXB Marshaller JAXB 版本 2 2 将 XML java 对象序列化为 XML 文件 现在在 xml 对象中 我有一个标签 其中包含字符串值这样 lt tagA gt lt YYYYY gt done lt
  • ASP.NET Web 服务错误地返回 XML 而不是 JSON

    我正在尝试使用 jQuery 从 javascript 使用 ASMX Web 服务 当我要求 XML 时它工作得很好 但我想利用 net 的 JSON 序列化功能 这也开始让我烦恼 这不起作用 Web 服务的代码 using System
  • 像 Javascript“Math.round()”那样的 Pythonic 方式“r​​ound()”?

    我想要最 Pythonic 的方式来舍入数字 就像 Javascript 那样 通过Math round 它们实际上略有不同 但这种差异会对我的应用程序产生巨大的影响 Using round Python 3 中的方法 Returns th
  • 如何在 codeigniter 中使用 .htaccess 限制图像文件夹

    我有包含图像文件夹的 codeigniter 项目 我想让它无法通过直接 url 访问假设有人输入 url http localhost project images Pricelistupdated pdf 然后它将直接在浏览器选项卡中打
  • 课堂上的自定义事件

    我需要从类启动自定义事件 我知道用 DOM 对象和 jquery 来做到这一点 使用triggerHandler 比如 object triggerHandler inputChange param X 问题是当我在一个类中尝试这个时 如下
  • 如何以编程方式使用 ical 从重复集中删除单个事件?

    我在 10 11 日创建了一个重复事件 请参见下文 我想删除第 10 个事件 因此我使用了方法 取消 但由于 UID 相同 两条记录都将被删除 如何只删除一条记录 我应该使用任何其他值 例如 UID 吗 BEGIN VCALENDAR PR
  • XML 格式错误

    我有一个 php 脚本 用于将 xml 数据写入文件 另一个脚本将该文件的内容作为响应发送到客户端 但在客户端 我收到以下错误 XML 解析错误 格式不正确当我查看页面源时 我看到的 XML 如下
  • 制作多个文件强制下载

    抱歉 如果标题没有解释太多 让我尝试进一步解释 我的代码如下所示
  • 传单地图中奇怪的默认尺寸

    我已经拍摄了一张可用的 Leaflet 地图 但是当我添加 JQuery Mobile 标题和后退按钮时 格式变得疯狂 最初加载页面时 所有内容都加载在左上角 但是当页面在桌面上调整到最小大小或在移动设备上旋转时 一切都很好 这是打开后的样
  • 自定义类排序:没有抛出错误,Python 测试的目的是什么?

    在不指定对象的相等比较属性的情况下 Python在使用时仍然在做一些事情 gt and lt 如果您不指定 Python 实际上是通过什么来比较这些对象的 gt or lt 我预计这里会出现不受支持的操作数错误 就像在尝试将两个对象添加在一
  • 以编程方式修复 IE 中的浏览器模式

    我有一个网站完全兼容所有浏览器 包括 IE 7 至 9 当我在 IE 10 上尝试时 我感到很震惊 错误太多 而且因为我没有时间为 IE 10 修复这个问题 而且我也在使用第三方控件 Telerik 所以我决定尝试一个简单的解决方案 文档和
  • 返回具有单个元素的数组或列表时的列表或标量上下文

    我有一个函数func可以返回单个值或值列表 具体取决于函数的调用方式 因此 对于这个特定的函数 调用者会知道何时只期望一个返回值 因此希望使用更简单的语法my var func 代替my var func 问题是 在某些情况下 单个值会转换