2011-10-25 4 views
1

긴 줄이있는 파일을 구문 분석 할 때 토큰의 공백을 구분합니다. 대부분의 행을 처리하기 전에, n 번째 (작은 n의 경우) 토큰에 어떤 값이 있는지 확인하고 싶습니다. 나는 줄의 대부분을 생략 할 것이므로, 정말로 긴 줄의 대부분을 나눌 필요는 없다. Perl에서 게으른 분할을 수행하는 빠른 방법이 있습니까? 아니면 내 자신을 굴릴 필요가 있습니까?Perl에서 문자열의 특정 부분 만 어떻게 나눌 수 있습니까?

답변

9

split 연산자에 제한 인수를 제공하여 특정 개수의 토큰이 생성 된 후에 Perl이 분할을 중지하도록 할 수 있습니다.

@fields = split /\s+/, $expression, 4 

예를 들어, @list의 4 요소 3 공백으로 구분 된 필드 다음에 모든 것을 넣어 것입니다. 표현식에 4 개 이상의 필드가있을 때 완전한 분할을 수행하는 것보다 더 효율적입니다.

이 게으른 분할을 수행하고 회선을 추가로 처리해야한다고 결정한 경우 회선을 다시 split해야합니다. 라인의 길이와 재 처리해야하는 빈도에 따라 여전히 나올 수 있습니다.


또 다른 방법은 당신이 관심있는 라인의 일부를 분할 할 수있다. 예를 들어, 선은 많은 분야를 포함하지만 당신은 4 필드를 필터링 할 그리고 당신은 그 네번째 필드 항상 확신

@fields = split /\s+/, substr($expression, 0, 100); 
if (matches_some_condition($line[3])) { 
    # process the whole line 
    @fields = split /\s+/, $expression; 
    ... 
} 

말을 가끔 표현이 두 번 항상 전체 표현을 한 번 분할보다 더 효율적일 수 있습니다 분할, 라인에 100 바이트 전에 발생합니다.

5

perldoc -f split :

LIMIT를 지정하고 긍정적 인 경우,이 필드의 실제 수는 반환 불구하고, EXPR이로 분할됩니다 필드의 최대 수를 나타냅니다 패턴이 EXPR 내에서 일치하는 횟수에 따라 달라집니다 .

my $nth = (split ' ', $line, $n + 1)[$n - 1]; 
관련 문제