2010-01-11 249 views
72

我刚刚一直在使用这个代码来检查,如果一个字符串是空的:在Perl中检查字符串是否为空的正确方法是什么?

if ($str == "") 
{ 
    // ... 
} 

而且还与不等于运算符一样......

if ($str != "") 
{ 
    // ... 
} 

这似乎是工作(我想想),但我不确定这是否是正确的方式,或者是否有任何不可预见的缺陷。有些事情对此感觉不对。

回答

106

对于在Perl字符串比较,使用eqne

if ($str eq "") 
{ 
    // ... 
} 

==!=运营商数字比较运算符。他们会尝试将两个操作数转换为整数,然后再比较它们。

有关更多信息,请参阅perlop手册页。

+0

是啊,用这个虽然你需要保持谨慎,如果它是民主基金,如果你正在使用你的警告会得到一个运行时警告。许多方法来解决警告。 –

2

除了使用CPAN之外,“正确”做任何事情的概念在Perl中都是不存在的。

反正这些都是数字运营商,你应该使用

if($foo eq "") 

if(length($foo) == 0) 
+3

的确,Perl并不倾向于提倡解决问题的“一个真正的方法”,但这并不意味着没有强烈偏好的习惯用法,样式和方法。另外,正如Perl的一位常客喜欢说的那样,即使有不止一种方法来做事情,一些做事的方式真的非常糟糕(愚蠢,不明智,难以维护等) – Telemachus

+2

只是因为有很多方法才能做到这并不意味着所有的方式都是平等的。例如,使用if($ foo ==“”)'测试空字符串*是明确错误的*,除非您实际上是在测试数值上下文中计算的$ foo是否具有值0在这种情况下,它会*更好地写成'if($ foo == 0)',因为它更清楚地表达你的意图)。 –

9

你可能想使用 “EQ”,而不是 “==”。 如果你担心,你可能还需要检查未定义一些边缘情况:

if (not defined $str) { 

# this variable is undefined 

} 
+1

当你通过移动可能有0个元素的数组来获得字符串时非常有用。 – Dacav

9

由于已经由几个人提到,eq在这里正确的操作。

如果您在脚本中使用了use warnings;,则会收到有关此警告(以及其他许多有用的内容)的警告;我推荐use strict;

+0

+1酷,是的,我通常使用'严格',但我更新一些旧的代码,所以当我添加这个时,我得到了数百个错误。我可能会在一天之内修复它们。 –

82
  1. 由于字符串存储在Perl中的方式,获取字符串的长度被优化。
    if (length $str)是一个检查字符串是否为空的好方法。

  2. 如果您的情况下,您尚未对undef进行防范,那么不会警告的“非空”的招聘信息是if (defined $str and length $str)

+3

我认为这个长度是最接近的测试,我们必须表达这个想法,即字符串中没有任何东西。 –

+3

Upvoted是因为'if(length($ str))'是一个不错的方法,如果变量没有被定义也不会失败。 – basic6

0

要检查是否有一个空字符串,你也可以做一些事情如下

if (!defined $val || $val eq '') 
{ 
    # empty 
} 
相关问题