2012-06-26 1 views
2

Я начинаю изучать perl, и я пишу простой пузырь, используя регулярные выражения. Однако я не могу заставить его правильно сортировать (в алфавитном порядке, ограничивая пробелы). Он просто заканчивается тем, что возвращает ту же строку. Может кто-нибудь помочь? Я уверен, что это действительно просто. Спасибо:Запись сортировки пузыря с использованием регулярных выражений 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, и я увидел аналогичный пример в книге «Начало Perl». Я пытаюсь воспроизвести его – Nosrettap

+0

Это звучит как плохая идея - приходит «правильный инструмент для правильной работы». Регулярные выражения отлично подходят для сопоставления/идентификации и изменения текста, который, как известно, следует за каким-то шаблоном - следовательно имя. Разновидность пузыря - не такая проблема. Перл: уверен. Regex: нет. – 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))); 
Смежные вопросы