在Perl中检查字符串是否为空的正确方法是什么?


94

我一直在使用此代码来检查字符串是否为空:

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

不等于运算符也一样...

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

这似乎可行(我认为),但我不确定这是否正确,或者是否存在任何无法预见的缺点。只是有些不对劲。

Answers:


133

对于Perl中的字符串比较,请使用eqne

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

==!=运营商的数字比较操作符。在比较它们之前,它们将尝试将两个操作数都转换为整数。

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


是的,尽管要谨慎使用它,但如果要确保它未定义,并且使用警告,则会收到运行时警告。虽然有很多方法可以解决警告。
埃文·卡罗尔

89
  1. 由于将字符串存储在Perl中的方式,优化了字符串的长度。
    if (length $str)是检查字符串是否为非空的好方法。

  2. 如果您处在尚未防御的情况下undef,那么不会发出警告的“非空”总称是if (defined $str and length $str)


6
我认为长度是我们对字符串没有任何内容这一想法的最接近的检验。
brian d foy 2010年

6
赞成,因为这if (length($str))是一种不错的方法,并且如果未定义变量也不会失败。
basic6 '19年

10

您可能要使用“ eq”而不是“ ==“。如果您担心某些极端情况,则可能还需要检查未定义的情况:

if (not defined $str) {

# this variable is undefined

}

1
通过移动可能包含0个元素的数组获得字符串时非常有用。
2011年

9

正如几个人已经提到的,eq这里是正确的运算符。

如果您use warnings;使用脚本,则会收到有关此警告(以及许多其他有用的信息);我也建议use strict;


+1很酷,是的,我通常会使用,use strict但是我正在更新一些旧代码,因此添加此代码时会出现数百个错误。我可能有一天会修复它们。
尼克·博尔顿

4

在Perl中,除了使用CPAN之外,“正确”的方法无所不包。

无论如何,这些都是数字运算符,您应该使用

if($foo eq "")

要么

if(length($foo) == 0)

3
的确,Perl不会倾向于倡导解决问题的“一种真正的方法”,但这并不意味着没有强烈喜欢的习惯用法,样式和方法。而且,正如Perl的一名常客喜欢说的那样,即使有多种做事方法,某些做事方法也确实非常糟糕(愚蠢,不明智,难以维护等)。 。)
Telemachus 2010年

2
仅仅因为有很多方法可以做到,并不意味着所有方法都是平等的。使用空字符串进行测试if ($foo == ""),例如,是明确错误的,除非你实际上意味着被检测为是否$foo(在这种情况下,将在数字方面评估,具有0值仍然可以更好地写作if ($foo == 0),因为这更清楚地表达你意图)。
戴夫·谢罗曼

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.