Perl条件(三目)运算符未按预期实现短路求值问题
问题原因
这个异常结果是Perl运算符优先级规则导致的,和三目运算符本身的条件分支逻辑无关。
Perl中条件运算符?:的优先级高于所有赋值类运算符(包括=、.=等),你写的无括号表达式不会按照你预期的逻辑分组。
你编写的代码:
1 ? $s .= '_' : $s = '_'
会被Perl编译器默认解析为:
(1 ? ($s .= '_') : $s) = '_'
执行流程
- 条件
1为真,进入?后的分支,执行$s .= '_',此时$s的值暂时变为X_ - Perl的三目运算符支持返回可修改的左值,这里条件为真,所以三目运算的返回值就是变量
$s本身 - 最后执行赋值操作
= '_',把$s的值直接覆盖为_
因此最终输出的$s是_,而不是你预期的X_。
解决方案
如果要实现“条件为真时拼接下划线,为假时赋值为下划线”的预期逻辑,需要给两个分支显式加括号,强制改变优先级:
1 ? ($s .= '_') : ($s = '_')
执行后$s的值就会是预期的X_。
内容的提问来源于stack exchange,提问作者U. Windl
相关产品推荐
相关产品推荐

