perl - 为什么 `my $x = if (0) {1} else {2}` 不起作用?
问题描述
在 perl 中,$x = if (0) {1} else {2}
不起作用。
$ perl -E'$x = if (0) {1} else {2}'
syntax error at -e line 1, near "= if"
Execution of -e aborted due to compilation errors.
这是有道理的,因为if
条件不是 Perl 中的表达式。他们是流量控制。
但是之后
my $x = do { if (0) {1} else {2} };
行得通!为什么do BLOCK
可以接受if
条件?但是赋值不行吗?在上面看来,流控制必须要么
- 知道它的上下文
do BLOCK
- 始终充当表达式,但解析器不允许使用该语法。
此外,鉴于上述简单事实,描述表现类似的 if 条件的正确方法是什么?它是一个有值的表达式吗?是不是评估后没有价值的流量控制结构?
最后,必须对 assignment 进行哪些修改才能使其接受if
类似 a 的条件do BLOCK
。
解决方案
解决问题的唯一答案和评论是金兹,
总体设计是 perl 具有仅在某些上下文中有意义的关键字,并且
if
是其中之一 - 它只能是语句的开头或语句修饰符,并且在=
. 这首先是解析器的区别。除此之外,对“if
语句返回什么”的考虑并不总是直观的,因此虽然您可以通过将其放在 do 块或子例程的最后一条语句中找到它,但不应该鼓励将其用作一个值。事实上,它通常会导致错误。– 格林茨 11 小时前
当 Ginnz 说解析器区别时,我将其解释为意味着为了清楚起见,这并不值得追求。在 an 之后有效的=
内容根本不是if
陈述,也没有真正的理由,只是它就是这样。
if
条件是一个语句。- 语句的返回值。
- 赋值
=
明确禁止右边的语句,因为它只接受表达式类中的东西。 - a
do BLOCK
可以将语句转换为表达式。
推荐阅读
- xml - 如何定义测试重复 XML 元素节点值的 XSLT 测试
- angular - 如果函数只返回文本,模板中的变量和函数调用之间有区别吗?
- vba - 以编程方式在word中添加脚注
- css - React fullpage.js 的 z-index 堆叠问题
- python - 如何在ubuntu上的blender 2.80 python中安装熊猫?
- visual-studio - Visual Studio 包 - 获取当前活动的文档并对其进行编辑,包括 peek 定义
- asp.net-core - ASP.NET Core 将结果发布到电子邮件
- flutter - 颤动从firebase存储中删除图像
- r - ForestTools R 包中树顶检测的错误
- python - 在 numpy 数组上应用通用二元运算符