2012-06-26 3 views
2

나는 펄을 배우기 시작했고 정규 표현식을 사용하여 간단한 버블 정렬을 작성하고 있습니다. 그러나, 나는 제대로 정렬 (알파벳순으로, 공백으로 구분) 얻을 수 없습니다. 그것은 단지 같은 문자열을 반환 끝납니다. 누군가 도울 수 있습니까? 정말 간단하다고 확신합니다. 감사 :Perl 정규식을 사용하여 버블 정렬 작성하기

#!/usr/bin/perl 
use warnings; 
use strict; 

my $document=<<EOF; 
This is the beginning of my text...#more text here; 
EOF 

my $continue = 1; 
my $swaps = 0; 
my $currentWordNumber = 0; 
while($continue) 
{ 
     $document =~ m#^(\w+\s+){$currentWordNumber}#g; 
     if($document =~ m#\G(\w+)(\s+)(\w+)#) 
     { 
       if($3 lt $1) 
       { 
         $document =~ s#\G(\w+)(\s+)(\w+)#$3$2$1#; 
         $swaps++; 
       } 
       else 
       { 
         pos($document) = 0; 
       } 
       $currentWordNumber++; 
     } 
     else 
     { 
       $continue = 0 if ($swaps == 0); 
       $swaps = 0; 
       $currentWordNumber = 0; 
     } 
} 

print $document; 

해결 : 문제를 파악했습니다. 한 마디로 구두점을 고려하지 않았습니다.

+0

왜 정규식과 버블 정렬? – nhahtdh

+0

나는 펄을 배우려고하고 있는데, "Perl 시작"이라는 책에서 비슷한 예를 보았다. 나는 그것을 복제하려고 시도하고있다 – Nosrettap

+0

이것은 올바른 생각을하는 것처럼 들린다. 올바른 작업을위한 "적절한 도구"가 나온다. 정규 표현식은 어떤 종류의 패턴을 따르는 것으로 알려진 텍스트를 매칭/식별하고 변경하기에 좋다. 이름. 버블 정렬은 이런 종류의 문제가 아닙니다. Perl : 물론이지. 정규식 : 안돼. – lxop

답변

2

그냥 모든 단어를 정렬 할 경우, 당신은 단순히 줄 바꿈과 공백으로 텍스트를 분할 ... 정규 표현식을 사용하지 않아도 훨씬 빠르게해야한다 :

sub bsort { 
    my @x = @_; 
    for my $i (0..$#x) { 
     for my $j (0..$i) { 
      @x[$i, $j] = @x[$j, $i] if $x[$i] lt $x[$j]; 
     } 
    } 
    return @x; 
} 

print join (" ", bsort(split(/\s+/, $document)));