字符串上下文中的Perl条件运算符

时间:2014-04-14 08:29:58

标签: perl

让我们采取以下简约剧本:

#!/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并认为,字符串连接应该是可能的。

有人可以解释这种行为吗?

2 个答案:

答案 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希望向您解释这些问题。你只需要问问你做错了什么: - )