2009-12-08 7 views
2
내가

Perl에서 쉼표로 구분 된 문자열에서 단어를 추출하려면 어떻게합니까?

$myline = 'ca,cb,cc,cd,ce'; 

x 1, , $ 2 등등에 ca를 일치시킬 필요가있다.

불행히도

$myline =~ /(?:(\w+),?)+/; 

doesn ' 일하지 마라. pcretest를 사용하면 'ce'과 $ 1이 일치합니다. 그것을 올바르게하는 방법? while 루프에 넣어야합니까?

고마워!

+0

, 당신은 같은 CSV 모듈을 사용할 수 있습니다 http://search.cpan.org/~makamaka/Text-CSV-1.16/lib/Text/CSV.pm –

답변

9

my @parts = split(/,/, $myline)은 사용하기가 쉽지 않습니까?

@parts = split(/,/,$myline); 

split 당신은 구분 기호로 공급하는 정규 표현식을 사용하여 문자열 목록에 문자열을 분할 :

+0

맞아요! 가장 쉬운 방법은 split! –

1

요소의 개수가 가변적이면 목표로하는 방식대로 수행하지 않을 것입니다. 그 다음 사용하지 그러나 경우,

while($myline =~ /(\w+)\b/g) { 
    # do something with $1 
}

나는 당신의 실제 데이터가 '캘리포니아, CB, CC, CD, CE'보다 더 복잡하다는 생각 하겠어 : 글로벌 플래그를 사용하여 문자열을 통해 루프 아마 정규 표현식이 보증되지 않습니다. 당신은 단락 문자 문자에 문자열을 분할 더 나을 것 : split 비록

my @things = split ',', $myline;
+0

네 말이 맞아. 제 경우에는 분할을 사용하는 것이 훨씬 낫습니다. 왜 내가 그걸 생각하지 않았 니? –

+0

Perl이기 때문에 여러 가지 방법이 있습니다. –

3

가 문제를 해결하는 좋은 방법이며,리스트 문맥에서 캡처 정규식은 잘 작동합니다. 두 가지 접근법을 아는 것이 유용합니다. csv로 PM의 당신이 CPAN에서 다운로드 할 수있는, 즉 Text::CSV 또는 Text::CSV_XS

my $line = 'ca,cb,cc,cd,ce'; 
my @words = $line =~ /(\w+)/g; 
+1

주목할만한 차이점은 split은 빈 항목을 보존하여 쉼표가 인접한 지점에서'undef'를 제공한다는 것입니다. regex 메소드는 하나 이상의 단어 문자를 포함하지 않으므로이 위치를 무시합니다. –

3

봐.

이렇게하면 필요한 것을 얻을 수 있으며 따옴표로 묶인 쉼표로 구분 된 값도 고려해야합니다. 이 모듈은 쉽게 밖으로 데이터를 분할하고 그것을 통해 분석 할 수 있도록 사용

... 예를 들어

: 단어가 쉼표를 포함 할 경우

my @field = $csv->fields; 
관련 문제