Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Посимвольная обработка строк


Автор: qw1mb0 30.9.2011, 18:03
Добрый день уважаемые форумчане.
Хотел бы задать вопрос. 
Перед мной стоит задача в подробности которой я вдаваться не буду, но не могу придумать как реализовать 1 функцию.
Например на вход подается строка a*a$
И я разбираю строку посимвольно, с помощью split.
Допустим если "а"(буква) то выводиться 1 сообщение, если "*"(символ), то другое и в таком духе.

split разбивает строку на массив символов.
А есть такое условие, если допустим будет строка aa*a$, то увидев "аа" должно вывести другое сообщение. 
Как можно разбить строку так, что бы он сначала детектил повторяющиеся символы, а потом уже разбивал на массив.

Заранее спасибо за помощь.

Автор: ginnie 30.9.2011, 18:20
qw1mb0, Вам это нужно?

Код

perl -e 'my $str = "aa*a\$"; while($str =~ /((.)\2*)/g) {warn $1}'

Автор: qw1mb0 30.9.2011, 18:37
ginnie, 
Впринципе да, но что-то у меня руки совсем кривые....

Вообщем более углубленно.
Я пока сам додумался только до глобальной замены вида:
Код

chomp (@n=<STDIN>);
for (@n){
if (s/\d\2*/\!/g){}
if(s/\w\2*/\?/g){}
}


Где дальше полученная строка будет разбиваться split'ом и там поиск по шаблону, если 1 буква то 1 сообщение, если 1 цифра то другое, если ! (соответствует 2 и более цифрам) третье и если ?(2 и более буквам) четвертое:
Код

@b=split (//,@n);
for (@b){.....}


Но что-то не так... Подскажите пожалуйста в чем может быть ошибка

Автор: ginnie 30.9.2011, 18:45
qw1mb0, попробуйте так

Код

while (my $line = <STDIN>) {
    push(@b, $1) while ($line =~ /(([^\r\n])\2*)/g);
}

Автор: tishaishii 30.9.2011, 21:25
perl -n

Код
BEGIN {
    ($,, $\, $|, %MSG)=(
        ("\n") x 2, 1, 
        'a'    =>'message 1',
        '*'    =>'message 2',
        'aa'    =>'message 3'
    );
    $RX=join '|', map quotemeta, sort length($b)<=>length($a), keys %MSG
}

print @MSG{/$RX/gsx}


Например:
Код

BEGIN {
    ($,, $\, $|, %MSG)=(
        ("\n") x 2, 1, 
        'a'    =>'message 1',
        '*'    =>'message 2',
        'aa'    =>'message 3'
    );
    $RX=join '|', map quotemeta, sort length($b)<=>length($a), keys %MSG
}

print @MSG{<<''=~/$RX/gsx};
a*babaaa*a

+1

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)