ベストプラクティスに関するアドバイスを探しています。空の文字列またはスペース文字のみが含まれている文字列をチェックするための最良の方法は何ですか?
私は通常、このような正規表現を使用$string =~/^\s*$/
して、変数が空白かどうかを確認します。もっと受け入れられている方法はありますか、それともこれは他の方法と同じくらい良いですか?正規表現を使用するか、チョップしてから空の文字列をチェックする方が良いですか?
ありがとう。
個人的には、私は一般的に意味を逆にして、空白以外の単一の文字を検索します。だから私は次のようなことを言うでしょう:
next unless $string =~ /\S/;
池上が述べたように、\s
(および\S
)は、どの文字が空白と見なされるかについて少し特異である可能性があり、より一貫した結果を得るため\p{Whitespace}
に(または私の場合は)使用できます。\P{Whitespace}
好奇心から、私はnot /\S/
対をベンチマークし/^\s*\z/
ました。80文字の文字列(Perl 5.14.2を使用)では、not /\S/
スペースの文字列では約20%速く、/^\s*\z/
非スペースの文字列では約30%高速であることがわかりました。空白行のチェックがプログラムのボトルネックになる可能性は低いですが、より単純な正規表現を使用しても問題はありません。
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% --
非スペースの結果の例:
Rate negU neg pos
negU 4951234/s -- -3% -24%
neg 5112271/s 3% -- -22%
pos 6555251/s 32% 28% --
それは完全に問題あり/^\s*\z/
ません(ただし、冗長性は低くなります)。
注: 垂直タブ (U+000B) とは一致しません。そのために使えます\p{Whitespace}
。
注: バグにより、use 5.012;
または/u
が使用されない限り、No-Break Space (U+00A0) にのみ一致することがあります。\p{Whitespace}
そのバグの影響を受けません。