perl - Perl 方程中的 shift 执行顺序
问题描述
为了演示我的问题,请考虑以下 Perl 代码:
use strict;
use warnings;
use Data::Dumper;
my @a = (1, 2);
my %h;
sub test {
$h{shift @_} = shift;
}
&test(@a);
print Dumper(%h);
输出如下:
$VAR1 = '2';
$VAR2 = 1;
shift
为什么 Perl从等式右侧执行第一个,而不是从左侧执行?
为什么输出不如下?
$VAR1 = '1';
$VAR2 = 2;
解决方案
在大多数语言中,对于大多数运算符来说,操作数的求值顺序是未定义的或至少是未记录的。[1] Perl 也不例外。
f() + g()
打电话f()
还是g()
先?好吧,那是未记录的,可能是未定义的。
现在,事实证明,perl
目前非常一致。二元算术运算符将始终在其右侧操作数之前评估其左侧操作数(包括**
右结合运算符),而标量赋值运算符和列表赋值运算符将在其 LHS 操作数之前评估其 RHS 操作数。
值得注意的例外包括标量上下文中的逗号运算符和短路运算符。
标量上下文中的逗号运算符被记录为在其 RHS 之前评估其 LHS,尽管在列表上下文中调用它时没有这样的保证。
短路运算符——即
&&
,||
,and
和or
条件运算符——必须在任何其他操作数之前计算它们的 LHS。
推荐阅读
- r - R中ID代码的系统替换
- wpf - 如何通过数据绑定的方式启动 Storyboard?
- php - 提交一个表单时发送两封不同的电子邮件
- twitter - 什么是 twurl 命令,用于触发无效 webhook id 的 twitter 质询响应检查 (crc) 以使其再次有效?
- http - Clojure 跨域错误 - 完全丢失
- cordova - 离子文件选择器到文件管理器根据 Mime 类型
- python - 使用 pytesseract 和 OpenCV 对平面图屏幕截图进行 OCR
- javascript - 在dowhile循环中执行正则表达式
- angular - 我想创建一个包含多个组件的反应式表单,并希望在用户单击提交按钮时验证所有必填字段
- reactjs - 使用 Redux Thunk 和 Apollo Graphql 做出反应 - 如何访问 client.query?