Perl 中的列表运算符优先级

2024-04-06

我正在读《Beginning Perl》一书,它给出了以下两条语句:

print "Test one: ", 6 > 3 && 3 > 4, "\n";
print "Test two: ", 6 > 3 and 3 > 4, "\n";

第一行不打印任何内容并换行,第二行打印 1 且不换行。

我对输出感到困惑。根据作者的说法,第二个语句给出了奇怪的输出,因为它就像在说:

print ("Test two: ", 6 > 3) and 3 > 4, "\n";

但是,为什么第一个说法不一样呢?我认为这与印刷的优先顺序有关。 && 的优先级高于 print,因此首先对其求值,然后再打印。而“and”的优先级低于 print,因此将打印 6 > 3,print 返回 1,然后使用“and”对其求值。然而这并没有什么意义。

我已经阅读了有关列表运算符的优先级如何工作的 Perl 文档,但我仍然不理解这个示例。你们能剖析一下这两个语句,并告诉我首先打印的是什么吗?您能否解释一下 Perl 文档中提到列表运算符“向左”和“向右”时的含义?谢谢。


非常感谢大家的回答。我现在明白了。我确实按照cjm所说的做了,并认为有向左和向右列表运算符。现在我明白了这意味着什么,我就明白了整件事。


好的,对于初学者来说:列表运算符是 Perl 中优先级最低的事物之一,但是仅在他们的右侧。你问这意味着什么:好吧,让我们简单点。假设有一个名为的listopfoo。它做什么并不重要,但它就在那里。你可以轻松地创建这样的东西sub foo { map 10 * $_, @_ }它返回每个参数乘以十的结果。那不碍事:

print 1, 2, 3;相当于print( 1, 2, 3 );
print foo 1, 2, 3;相当于print( foo( 1, 2, 3 ) );
print 1, foo 2, 3;相当于print( 1, foo( 2, 3 ) );

我们可以看到foo在右侧尽可能多地吞噬——只有语句的结尾(到目前为止......)才能阻止它。如果我们写@array = (1, foo 2, 3);这相当于@array = (1, foo(2, 3) );因为当然结束括号仍然适用。

由于逗号的优先级也非常低(就在“列表运算符(向右)”上方),我们还可以将几乎任何类型的表达式放入 listop 的参数中 - 这只是 perl 确保我们不这样做的方式大多数时候不必添加括号。数学、按位运算符、比较,甚至正则表达式匹配都具有更高的优先级。

唯一的事情是do具有较低优先级的是拼写出来的逻辑连接词and, or, xor, and not。所以如果我们写

foo 1, 2, 3 and 4;

这意味着(foo(1, 2, 3) and 4)——论据foo停在左边and。这在一个人为的例子中看起来很愚蠢,所以让我们把它变成一个常见的 Perl 习惯用法:

open $fh, '<', $filename or die "$! opening $filename";

这相当于

(open($fh, '<', $filename) or die("$! opening $filename"));

这实际上完全等同于(并编译为)

die "$! opening $filename" unless open $fh, '<', $filename;

使用语句修饰符形式unless(它根本不是一个运算符,每个语句只允许一次,并且只出现在语句的末尾,因此它根本不参与优先级,但您可以将其视为“低于最低”优先向左)。

所以无论如何,回到你的原始代码示例——参数print的左侧结束and,并在右侧and是一个完全独立的逗号表达式——它什么也不做,因为它只是一些常量3 > 4 and "\n"在 void 上下文中进行评估。

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

Perl 中的列表运算符优先级 的相关文章

  • “foreach”循环中会发生什么样的本地化?

    来自 perldocperlsyn http perldoc perl org perlsyn html Foreach Loops关于 Foreach 循环的主题 如果变量之前是 用 my 声明 它使用 变量而不是全局变量 但它仍然局限于
  • 在 Perl 中实现 CLI 工具的最佳实践是什么?

    我正在使用 Perl 实现 CLI 工具 我们可以遵循哪些最佳实践 作为前言 我花了 3 年时间为一家大型金融公司设计并实现了一个相当复杂的 Perl 命令行工具集 以下想法基本上是我们团队设计指南的一部分 用户界面 命令行选项 允许尽可能
  • 如何在 Perl 中将多个哈希值合并为一个哈希值?

    在 Perl 中 我如何得到这个 VAR1 999 gt 998 gt 908 906 0 998 907 VAR1 999 gt 991 gt 913 920 918 998 916 919 917 915 912 914 VAR1 99
  • 如何在 Perl 中的不同包之间共享全局值?

    是否有一种标准方法可以对模块进行编码以保存要包含在每个其他包中的全局应用程序参数 例如 use Config 一个简单的包 只包含our变量 只读变量怎么样 已经有一个标准配置模块 http perldoc perl org Config
  • 将日期转换为指定格式并比较两个日期

    给定两个日期 Date1 format yyyy mm dd hh mm ss eg 2013 05 21 07 47 21 Date2 format Day Month date hh mm ss yyyy eg Thu Aug 1 09
  • 无法在 Mac 上安装 DBD::mysql

    第一次发帖 格式可能不太对 请见谅 我一直在尝试使用 cpan 在 macOS Catalina 上安装 DBD mysql 但尚未成功 我使用了perlbrew 并尝试了mysql和mariaDB 但仍然没有成功 另外 我在网上研究了不同
  • Mason 方法范围 - 覆盖

    Using Mason2 https metacpan org pod Mason 有 3 个组件 Base mc tmp Base mc tmp index mc The tmp index mc内容 hello from the Som
  • Perl 中的“@_”有什么作用?

    我浏览了一些我在 Perl 类中编写的代码 我注意到了这一点 my string my stringarray split string 我想知道两件事 变量位于括号中的第一行 这是声明多个变量时所做的事情 如果我删除它们 它仍然可以正常工
  • Perl 中的 Fork 无法在从文件读取的 while 循环内工作

    我正在运行一个 while 循环来读取文件中的每一行 然后使用该行的数据将进程分叉给子进程 N 行之后 我想等待子进程结束并继续接下来的 N 行 等等 它看起来像这样 while w
  • 标量值错误(使用 IO::Socket)

    这是我当前的代码 usr bin perl w use strict require IO Socket while lt gt chomp my host my header print Connecting to host n my s
  • 多维哈希排序 - Perl [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我真的需要一些帮助来理解这个哈希并对
  • Perl 脚本(或任何东西)来合计 CSV 列

    我写了 在其他人的很多帮助下 awk command https stackoverflow com questions 4159224 excel and awk disagree about csv totals 4159404 415
  • Perl - 以相反的顺序逐行读取文件[重复]

    这个问题在这里已经有答案了 可能的重复 如何在 Perl 中从文件末尾读取行 https stackoverflow com questions 303053 how can i read lines from the end of fil
  • 如何检测已更改的网页?

    在我的应用程序中 我使用 LWP 定期获取网页 无论如何 是否要检查两次连续提取之间网页是否在某些方面发生了变化 除了明确进行比较之外 是否有在较低协议层生成的任何签名 例如 CRC 可以提取并与旧签名进行比较以查看可能的更改 有两种可能的
  • Perl 删除目录中的所有文件

    我怎样才能删除allPerl 中目录中的文件 不删除目录 我的主机只允许最多 250 000 个 文件 而我的 tmp 文件夹会在所有会话 cookie 运行的情况下快速填充 250 000 个 qouta 在这种情况下我无法删除 tmp
  • 为什么我不应该使用 UNIVERSAL::isa?

    根据这个 http perldoc perl org UNIVERSAL html http perldoc perl org UNIVERSAL html 我不应该使用 UNIVERSAL isa 而应该使用 obj gt isa 或 C
  • Perl 中的布尔函数应该返回什么值?

    简短的问题 在 Perl 代码库中一致表示真假的最佳方法是什么 1 0 1 Perl 原生布尔运算符的特殊空字符串 return undef 即空列表 问题背景 我们都知道 Perl 在布尔值方面非常灵活 就像大多数事情一样 例如 Perl
  • 迭代哈希数组

    我编写了下面的例程 迭代哈希值 0 7 并打印出每个哈希值中特定键的值 我需要获取每个哈希中 b4 的值 我想取消 0 7 当存在不同数量的哈希值时使用更智能的东西 例如 有时只有 2 个 也可能有 160 个 my out decode
  • Perl Tk 模块有哪些缺点?

    与在 Perl 中创建 GUI 的其他解决方案相比 Tk 模块有哪些缺点 我最近浏览了 Perl 的各种 gui 模块 这是我的总结 免责声明 最终我发现现有模块都不能满足我的需求 所以我开始编写自己的 gui 工具包 Tk 工作起来很不错
  • 根据插入顺序迭代哈希?

    不想对条目进行排序 使用它也不会保留顺序 foreach my val keys hash 默认情况下 Perl 5 中的哈希值是无序的 您可以使用tie http perldoc perl org functions tie html a

随机推荐

  • 如何重置reactiveValues?

    重置单个无功值只需通过reactiveVal NULL 然而怎样才能彻底重置reactiveValues 虚拟应用程序包含我的一些方法来保留新鲜和干净的反应值 但它们都没有真正做到我希望它们做的事情 此外 观察时似乎有一种奇怪的行为reac
  • Geotools:wgs84 中缓冲区的边界框

    我需要一个 Java 函数来生成缓冲区周围的边界框 矩形 缓冲区由中心点 WGS84 坐标 和半径 以米为单位 定义 在 ITS 中获取缓冲区的边界框似乎非常简单 Point center Geometry boundingBox cent
  • jQuery 无法识别动态添加的 HTML

    阅读这里的其他一些内容 这个类似的问题 但我不确定如何将其应用于我的困境 我有一个 jquery 函数可以替换列表中的一些 HTML 例如 在函数运行之前 ul li blah blah blah li li blah blah blah
  • 如何在 R markdown SQL 块中使用 SQL 参数

    在 Rmd SQL 代码块中包含参数的正确方法是什么 这是一个 Rmd 文件示例 title Rmd Example output html document df print paged pdf document default r Sy
  • 如果 spring.mail.host 不在 application.properties 中,则 JavaMailSenderImpl 自动装配错误

    我在使用 JavaMailSenderImpl 在 Spring Boot 应用程序中发送电子邮件时遇到了一些 问题 我正在尝试动态设置所有属性 我希望将来从数据库中读取它们 但是 由于我不知道的原因 自动装配 JavaMailSender
  • Excel进程的最大数量?

    如果我这样做 例如 for int i 0 i lt 22 i var app new Excel Application 然后创建22个excel进程 但是 如果我这样做 for int i 0 i lt 25 i var app new
  • java中的DAO模式什么是业务对象

    直接来自this http www oracle com technetwork java dataaccessobject 138824 htmlOracle 关于 J2EE DAO 模式的文章 事实上 除了业务对象 参与者 他们这么称呼
  • 定时器可以提早吗?

    显然 System Threading Timer 回调应该会延迟一点 然而 可以提前调用吗 例如 如果您启动秒表并安排计时器在 1000 毫秒内运行回调 那么秒表是否有可能在回调中显示 999 或者我们可以指望它必须显示 1000 或更多
  • 收到警告“NDK 缺少“平台”目录。”没有 NDK [重复]

    这个问题在这里已经有答案了 我有一个仅使用 Android SDK 而不是 NDK 的项目 但每当我使用 gradle 构建时都会收到有关 NDK 的警告 NDK is missing a platforms directory If yo
  • 为什么说微软堆栈成本高? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 SQLite 上连接表时如何进行更新?

    我试过 UPDATE closure JOIN item ON item id id SET checked 0 WHERE ancestor id 1 And UPDATE closure item SET checked 0 WHERE
  • 穷人的 SQL 枢轴。将每个用户的问题和答案列在一行中

    当前查询 SELECT order id AS OrderNumber ordName ordLastName question answer FROM cart survey JOIN orders ON cart survey orde
  • ASP.NET MVC 2.0 Prev 1 和 SPARK?

    我正在尝试将 ASP NET MVC 1 0 应用程序升级到 2 0 预览版 1 我使用 Spark 作为视图引擎 问题 Spark 使用 System Web MVC 1 0 0 0 因此我获取了源代码并使用 2 0 0 0 重新编译并使
  • 无法解析 ACRA 4.7.0 中的方法“formKey”

    我今天尝试为我的 Android 项目设置 acra 但没有成功 我按照说明操作 在 gradle 中导入了 acra lib 编译 ch acra acra 4 7 0 然后我添加了这个 ReportsCrashes formKey ma
  • 告诉 urllib2 使用自定义 DNS

    我想告诉urllib2 urlopen or a 定制开瓶器 使用127 0 0 1 or 1 来解析地址 我不会改变我的 etc resolv conf 然而 一种可能的解决方案是使用类似的工具dnspython查询地址和httplib构
  • 在 Kotlin 中制作函数块

    我很高兴这可能已经得到解答 但我无法找到适合我的解决方案 Tl dr 如何制作功能块 我有以下用 Kotlin 为 Android API 28 编写的 BLE 相关代码 override fun onServicesDiscovered
  • 如何解决 SceneKit double notsupported 错误?

    过去几天我一直在研究 iOS 版 SceneKit 我在尝试创建自定义几何图形时遇到了一个问题 每当我尝试显示几何图形时 它都不会绘制 并在运行时向我显示此错误 SceneKit 错误 C3DRendererContextSetupResi
  • C# 无法从应用程序成功启动中打开串行端口

    因此 我正在打开这个端口并将端口名称保存在我的应用程序设置中 当我加载表单时 它尝试打开端口 但失败了 仅在单击我的 开放端口 按钮后EXACT端口打开时使用相同的代码 然后 如果我单击 关闭端口 按钮并重新打开表单 它就可以工作了 它会自
  • System.Windows.Forms.HtmlDocument 不包含 GetElementByID 的定义

    您能解释一下为什么我会收到此错误吗 private void startButton Click object sender EventArgs e HtmlElement mainNav webBrowser1 Document GetE
  • Perl 中的列表运算符优先级

    我正在读 Beginning Perl 一书 它给出了以下两条语句 print Test one 6 gt 3 3 gt 4 n print Test two 6 gt 3 and 3 gt 4 n 第一行不打印任何内容并换行 第二行打印