让我们采取以下简约剧本:
#!/usr/bin/perl
#
# conditional_operator.pl
#
use strict;
print ( 1 ? "true" : "false" )." statement\n";
exit;
我希望输出始终是“真实的陈述”。但是当我执行这个片段时,我看到......
deviolog@home:~/test$ perl conditional_operator.pl
true
似乎忽略了" statement\n"
连接。
我的perl版本是v5.14.2。我读了perlop manual about the conditional operator并认为,字符串连接应该是可能的。
有人可以解释这种行为吗?
答案 0 :(得分:10)
始终在每个脚本的顶部加入use warnings;
。
要获得所需的行为,只需添加括号,以便使用整个参数而不是第一部分调用print
:
print(( 1 ? "true" : "false" )." statement\n");
如果您已启用warnings
,则您会收到此提醒:
Useless use of concatenation (.) or string in void context
您还可以通过使用空白连接引导来避免不良行为,或者您可以在括号前加上加号:
print +( 1 ? "true" : "false" )." statement\n";
print ''.( 1 ? "true" : "false" )." statement\n";
答案 1 :(得分:2)
在代码中添加use warnings
即可:
print(...)在./cond第10行被解释为函数。
在。/ second第10行的无效上下文中无用地使用连接(。)或字符串。
更好的是,添加use diagnostics
就可以了:
print(...)被解释为./cond第11行(#1)
的函数(W语法)您违反了规则,即任何列表运算符 然后括号变成一个函数,包含所有列表 在括号内找到的运算符参数。看到 "术语和列表运算符(向左)"在perlop。
无效使用串联(。)或在。/ second第11行(#2)的void上下文中使用字符串
(W void)你做了一些没有副作用的事情 没有返回值,例如没有返回a的语句 块中的值,或标量逗号运算符的左侧。非常 通常这不是说你的愚蠢,而是Perl的失败 以你想象的方式解析你的程序。例如,你 如果你将C优先级与Python优先级混淆,那就得到这个 所述
$one, $two = 1, 2;
当你打算说
时($one, $two) = (1, 2);
另一个常见错误是使用普通括号来构造列表 你应该使用方括号或大括号的参考 例如,如果你说
$array = (1,2);
什么时候应该说
$array = [1,2];
方括号显式将列表值转换为标量值, 而括号则没有。因此,当评估带括号的列表时 在标量上下文中,逗号被视为C语言的逗号运算符 扔掉左边的参数,这不是你想要的。看到 perlref了解更多信息。
对于等于0或1的数值常量,不会发出此警告 因为它们经常用在像
这样的陈述中1 while sub_with_side_effects();
警告通常评估为0或1的字符串常量 约。
Perl希望向您解释这些问题。你只需要问问你做错了什么: - )