2010-06-29 4 views
4

텍스트 파일을 다양한 일치 변수로 구문 분석하는 긴 정규 표현식이 있습니다.펄에서 정규 표현식 일치 변수를 반복 처리하려면 어떻게해야합니까?

견고성을 위해 일치 변수에 공백이 포함될 수 있습니다. 일치 변수를 반복하여 체계적으로 공백을 제거하고 싶습니다.

예를 들어 일치 입력 변수 $2에서 $14까지 공백이 포함되어 있습니다.

내가 할 수있는 :

my @columns = my ($serNum, $helixID, $initResName, $initChainID, 
$initSeqNum, $initIcode, $endResName, $endChainID, $endSeqNum, 
$endICode, $helixClass, $comment, $length) = 
($2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14); 

### Remove whitespace      
foreach my $element (0..$#columns) { 
    $columns[$element] =~ s/^\s+//; 
    $columns[$element] =~ s/\s+$//; 
} 

그러나 이것은 단지 @column에있는 요소의 공백을 제거하고, 훼손되지 않은 등 제대로라는 스칼라, $serNum, $helixID을 떠난다.

각 일치 변수의 공백을 더 잘 명명 된 스칼라에 복사하기 전에 공백을 제거 할 수있는 방법이 있을까요? 아니면 잘 알려진 스칼라 자체를 반복하여 거기에서 공백을 제거 할 수있는 방법이 있습니까? ?

나는 이것을 참조로 할 수있는 방법이있을 것이라고 추정한다. 먼저 배열의 경기 변수를 저장할 수

+2

이름이 매겨진 변수에 매치 연산의 결과를 할당하기 만하면 ('m //')는'$ 2, $ 3, ...'를 참조 할 필요가 없다. 'my ($ serNum, ...) = ($ foo = ~ m/pattern /);' – Ether

+0

고마워요. 유용한 점입니다. – EMiller

답변

4

, 다음지도를 사용하여 공백을 제거 : 질문의 세부 좋은 수준을 볼 참신

my @matches = ($2, $3, $4, ...); 

my ($serNum, $helixID, ...) 
    = map { (my $v = $_) =~ s/^\s+|\s+$//g; $v } @matches; 
+0

eugene, 이것은 훌륭합니다 !! 거대한지도를 제안 해 주셔서 감사합니다. 맞지만 공백이없는 데이터를 캡처하도록 정규식을 수정할 수 있습니다. 메타 문자를 사용하면 캡처 할 문자의 종류를 제한하지 않아도됩니다. 모든 것을 포착하고 그 안에 공백을 포함 할 가능성이있는 데이터를 포함하여 모든 가능성을 나열하는 것보다 선행 및 후행 공백을 제거하는 것이 더 단순 해 보였다. – EMiller

+1

또는'my ($ serNum, $ helixID, ...) = grep {s #^\ s * | \ s * $ ## g} @matches; – Zaid

2

! 그것은 커뮤니티가 훨씬 더 좋은 방식으로 문제를 해결할 수있게합니다.

'well-named'배열에서 해시로 마이그레이션하는 방법입니다. 이것은 더 깔끔하고 코드에서 필요한 변수의 수를 줄일 수 있습니다.

my @matches = $data =~ m{$regex}; # Populates @matches with ($1, $2, $3, ..) 
my @labels = qw/serNum helixID initResName .../; # Create labels 

my %record;         # Initialize hash 
@record{@labels} = grep { s!^\s*|\s*$!!g } # Strips out leading/trailing spaces 
        @matches[1..$#matches]; # Populate %record with array slice 
              # Array slice of @matches needed to 
              # ignore the $1 

# Now data can be accessed as follows: 
print $record{helixID};      # Prints the helix ID in the record 

grep 일부 설명이 필요할 수 있습니다. map 호출 내에서 각 문자열을 어휘 적으로 복사하지 않아도되는 훌륭한 방법입니다.

본질적으로 grep은 어레이를 필터링합니다. 공백을 제거하는 정규식을 \s+에서 \s*으로 수정하여 정규식이 항상 일치하고 필터링 된 항목이 없는지 확인해야합니다.