2014-11-04 2 views
1

는이 같은 split를 사용하는 경우 :펄 분할 사용 "*"

cat dog

내가 얻을 :

my @split = split(/\s*/, $line); 
print "$split[1]\n"; 

input

a

을 그러나 나는 경우 \s+를에서 사용하십시오 split, 내가 얻을 :

dog

나는 그들이 동일한 결과를 생성하지 않는 이유에 궁금 하군요? 또한, 문자로 문자열을 분할하는 적절한 방법은 무엇입니까?

도움 주셔서 감사합니다.

답변

3

\s*은 0 개 이상의 공백 문자를 의미합니다. ca 사이에 cat 사이에 공백이 없으므로 결과가 나타납니다.다음과 같이

는 정규식 엔진에, 당신의 캐릭터는 외모 : 당신은 단지 catdog 사이의 여러 공간과 일치하는 구분자로 \s+를 사용하는 경우

c 
    zero spaces 
a 
    zero spaces 
t 
    multiple spaces 
d 
    zero spaces 
o 
    zero spaces 
g 

는,이 논리에 따라.

+0

아하나. Robby에게 감사드립니다. –

3

*은 0 회 이상 일치합니다. 즉, 문자 사이의 빈 문자열과 일치 할 수 있습니다. +은 1 회 이상 일치하므로 적어도 하나의 문자와 일치해야합니다.

이것은 split에 대한 설명서에 설명되어 있습니다 :

패턴이 빈 문자열과 일치하는 경우는 EXPR은 (문자 사이) 경기 위치에서 분할됩니다. 여기에 설명 된 바와 같이

.. split ' ', $line; 

:

다른 특별한 경우로 "당신은 공백에 분할 할 때

또한, 대부분의 시간은 정말 문자 그대로의 공간을 사용하려면 split "은 PATTERN이 생략되거나 리터럴 문자열이 하나의 공백 문자로 구성된 경우 명령 줄 도구 awk의 기본 동작을 에뮬레이트합니다 r (예 : ''또는 '\ x20', ). "/ /"). 이 경우 EXPR의 선행 공백은 분할이 일어나기 전에 이 제거되고 패턴은 "/ \ s + /"인 경우 으로 처리됩니다. 특히 이것은 연속적인 공백 (단 하나의 공백 문자가 아님)이 구분 기호로 사용된다는 것을 의미합니다. 그러나이 특수 처리는 문자열 ""대신 패턴을 지정하여 피할 수 있으므로 단일 공백 ​​문자 만 구분 기호로 사용할 수 있습니다.

2

당신은

c 
a 
t 

어떤 사람들이 선호하는이

my $line = 'cat'; 
my @split = split //, $line; 
print "$_\n" for @split; 

출력처럼, 당신은 split 위해 빈 정규식 패턴을 사용한다 개별 문자의 목록에 문자열을 분할 할 경우 unpack, 이와 같이

my @split = unpack '(A1)*', $line; 

정확히 동일한 결과를 제공합니다.