2009-12-14 3 views
3

의 구분 기호를 저장 : 을 분할 토큰에 문자열와 나는이 같은 문자열이 펄

a b c  d 

내가 이렇게 내 문자열을 처리 :

chomp $line; 
    my @tokens = split /\s+/, $line; 
    my @new_tokens; 
    foreach my $token (@tokens) {  
     push @new_tokens, some_complex_function($token); 
    } 
    my $new_str = join ' ', @tokens; 

내가하고 싶은 다시 가입 원래의 공백을 포함한 캐릭터 라인 분할 된 공백을 저장하고 나중에 다시 사용할 수있는 방법이 있습니까? 아니면 거대한 고통이 될 것입니까? 주로 화장품이지만 입력 문자열에서 원래 공간을 보존하고 싶습니다.

답변

15

당신이 분할 패턴이 결과 목록에 포함됩니다 캡처 괄호 정규식으로 분할하는 경우 (perldoc -f split 참조)

my @list = split /(\s+)/, 'a b c  d'; 
print Data::Dumper::Dumper(\@list); 

VAR1 = [ 
      'a', 
      ' ', 
      'b', 
      ' ', 
      'c', 
      '  ', 
      'd' 
     ]; 
4

는 그냥 단어 경계에 분할 : 당신의 예를 들어

split /\b/, $line; 

, 이것은 줄 것이다 :

('a',' ','b',' ','c','  ','d') 

편집 : 브라이언 d 개의 포이 지적으로 \b 잘못된 문자 클래스를 사용하여, 필자의 독창적 인 생각에 따라, 나는 look-around assertion을 사용했다. 이것은하지만, 에테르의 대답보다 훨씬 더 복잡 같습니다

split /(?:(?<=\S)(?=\s)|(?<=\s)(?=\S))/, $line; 
+1

이는 실수로 공백 경계없는 것들에 분할 할 수 있습니다. –

+0

지적 해 주셔서 감사합니다! 나는'\ w' 대'\ s'에 대해 생각하지 않고 원래의 답을 썼다. 그에 따라 내 대답을 편집했습니다. – hillu

3

단순히 다음을 수행하십시오. my $new_str = uc($line);?

업데이트 - 원본 uc()는 "더 복잡한 기능"의 약어입니다.

글쎄, 일반적으로도 할 수 있습니다

$line =~ s/(\S+)/more_complex_function($1)/ge; 
+1

내 실제 사례가 더 복잡하기 때문에 이것은 단지 예일뿐입니다. –

관련 문제