2012-06-04 3 views
1

모범 사례에 대한 조언을 찾고 있습니다. 비어 있거나 공백 문자 만 포함하는 문자열을 확인하는 가장 좋은 방법은 무엇입니까?Perl에서 빈 문자열 확인

일반적으로이 $string =~/^\s*$/과 같은 정규식을 사용하여 변수가 비어 있는지 확인하십시오. 좀 더 받아 들일 수있는 방법이 있습니까? 아니면 다른 것과 마찬가지로 좋습니다. regex를 사용하거나 chomp하고 빈 문자열을 확인하는 것이 더 낫습니까?

감사합니다.

+2

'chomp'와 동일한 결과를 얻을하지 않는 정규식 ... –

+0

내가 무엇을보고 네 말 뜻은. 지적 해 주셔서 고마워요. – Hameed

답변

3

개인적으로, 나는 일반적으로 감각을 뒤집어서 하나의 공백이 아닌 문자를 검색합니다.

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% -- 
+0

추가 마일 및 벤치마킹에 감사드립니다 :) – Hameed

2

완벽하게 괜찮습니다 (/^\s*\z/은 덜 중복 됨).

참고 : 수직 탭 (U + 000B)과 일치하지 않습니다. 그것에 대해 \p{Whitespace}을 사용할 수 있습니다.

참고 : 버그로 인해 use 5.012; 또는 /u이 사용되지 않는 경우에만 No-Break Space (U + 00A0)가 일부 일치합니다. \p{Whitespace}은 (는) 해당 버그가 적용되지 않습니다.

+0

질문에 대답 해 주셔서 감사합니다. – Hameed