Страница 1 из 1

вытащить текст по критериям

Добавлено: 2009-12-25 20:06:51
ProFTP
что-то я туплю

хотел решить элементарную задачу

нужно обработать регулрным выражением 2 строки

есть 2 возможных варианта:

$hhh = 'wiki/999/44/page_co/11';

$hhh = 'wiki/999/1/page_co/11';

(цифры для примера, т.е. цифры для примера, я так понимаю (\d+))

почему данный код не работает?

Код: Выделить всё

$hhh = 'wiki/999/page_co/11';

# $hhh = 'wiki/999/page_co/11';

print $hhh =~ /^wiki\/(\d+)(?:\/(\d+))\/page_co\/(\d+)$/;

print $1.'  '.$2.'   '.$3;


мне казалось что очевидно дожно работать, но не работает....

Re: вытащить текст по критериям

Добавлено: 2009-12-26 2:50:22
Гость
Как я понял из манов по перлу: (?:regex) - говорит, что не нужно то, что совпало записывать в переменную $1(или там 2,3...).
То есть вот эта конструкция:

Код: Выделить всё

$hhh =~ /^wiki\/(\d+)(?:\/(\d+))\/page_co\/(\d+)$/;
                            $1            $2                       $3
эквивалентна

Код: Выделить всё

$hhh =~ /^wiki\/(\d+)(\/(\d+))\/page_co\/(\d+)$/;
                             $1  $2  $3                      $4
только отличается лишь тем, что во второй используется $1 $2 $3 и $4.
То есть, чтобы оно работало надо после (?:regex) поставить ? или *(ну или {...}).

У меня с такой вот штукой:

Код: Выделить всё

$hhh =~ /^wiki\/(\d+)(?:\/(\d+))?\/page_co\/(\d+)$/;
выводится с $hhh = 'wiki/999/page_co/11';

Код: Выделить всё

         Use of uninitialized value in concatenation (.) or string at ./1.pl line 8.
         999      11
а с $hhh = 'wiki/999/1/page_co/11';

Код: Выделить всё

         999   1   11
Не знаю то ли это или не то, но может поможет...

Re: вытащить текст по критериям

Добавлено: 2009-12-26 9:04:47
zg
ProFTP писал(а):/^wiki\/(\d+)(?:\/(\d+))\/page_co\/(\d+)$/;
а не проще по слешам разбить? :roll: и из массива взять нужные занчения

Re: вытащить текст по критериям

Добавлено: 2009-12-26 14:02:15
ProFTP
Гость писал(а): То есть, чтобы оно работало надо после (?:regex) поставить ? или *(ну или {...}).

да, спасибо, забыл отписатся, нашел что со всем забыл про "знак вопроса", число совпадений...

мне приходилось только или парсить и вытаскивать, или искать, или заменять всегда....

я делал только то что мне надо было, надо будет какие-то практически задачки порешать, чтобы знать, чтоли...?
хотя, в perl5.10 очень много всего добавили...

zg писал(а):
ProFTP писал(а):/^wiki\/(\d+)(?:\/(\d+))\/page_co\/(\d+)$/;
а не проще по слешам разбить? :roll: и из массива взять нужные занчения
лучше, но тут надо написать регулярное выражение в атрибут метода класса (чтобы данный метод загрузился когда идет такая url в событиях во фремворке Catalyst), там именно так и сделано, оно идет потом в массив... @$c->req->captures

вроде бы работает

Код: Выделить всё

sub wiki_page_co : Regex('^wiki\/(\d+)(?:\/(\d+))?\/page_co\/(\d+)$')  { 
        my ( $self, $c ) = @_;
      
      $c->stash->{ page_co } = 1;

# use Data::Dumper;
# print Dumper($c->req->captures);
# print $c->req->captures->[2] if (!$c->req->captures->[1]);
      
    $c->forward( 'wiki', [ !$c->req->captures->[1] 
    							? $c->req->captures->[0]
    							: @{$c->req->captures}[0..2] ] );
    
 }