检查Perl中的空字符串

时间:2012-06-04 05:37:23

标签: perl string

我只是在寻找有关最佳实践的建议。检查空字符串或仅包含空格字符的字符串的最佳方法是什么?

我通常使用像$string =~/^\s*$/这样的正则表达式来查看变量是否为空。是否有更容易接受的方式或者这种方式与其他方式一样好?使用正则表达式或者选择并检查空字符串是否更好?

感谢。

2 个答案:

答案 0 :(得分:3)

就个人而言,我通常会颠倒感觉,并搜索单个非空白字符。所以我会说:

next unless $string =~ /\S/;

正如池上所提到的那样,\s(和\S)对于哪些字符被认为是空格有点特殊,你可以使用\p{Whitespace}(或者在我的情况下{{1} }})以获得更一致的结果。

出于好奇,我对\P{Whitespace}not /\S/进行了基准测试。在80个字符的字符串(使用Perl 5.14.2)上,我发现/^\s*\z/对于空格字符串的速度提高了大约20%,而对于非空格字符串,not /\S/的速度提高了约30%。检查空白行不太可能是程序中的瓶颈,但使用更简单的正则表达式肯定没有坏处。

/^\s*\z/

空格的示例结果:

use Benchmark 'cmpthese';

our $text = ' ' x 80;
#our $text = 'abcd' x 20;

cmpthese(-3, {
    'pos'  => '$text =~ /^\s*\z/',
    'neg'  => 'not $text =~ /\S/',
    'negU' => 'not $text =~ /\P{Whitespace}/',
});

非空格的示例结果:

          Rate  pos negU  neg
pos  3562012/s   --  -2% -15%
negU 3651619/s   3%   -- -13%
neg  4194275/s  18%  15%   --

答案 1 :(得分:2)

这很好(虽然/^\s*\z/不那么多余。)

注意:它与垂直标签(U + 000B)不匹配。您可以使用\p{Whitespace}

注意:除非使用use 5.012;/u,否则错误会使其仅在某些时间与No-Break Space(U + 00A0)匹配。 \p{Whitespace}不受该错误的影响。