The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"PERL поиск строки по шаблону =~m/*/"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы OpenNET: Виртуальная конференция (Public)
Изначальное сообщение [ Отслеживать ]

"PERL поиск строки по шаблону =~m/*/"  +/
Сообщение от Darktj email on 20-Авг-09, 18:31 
Привет всем!
ЕСТЬ определённая директория:
"music/name/dir1/dir2/dirN/file.mp3"
- при этом кол-во "dirN" неизвестно, то есть директория может выглядеть
так:
"music/name/dir1/file.mp3"
или так:
"music/name/dir1/dir2/file.mp3"

НУЖНО вытащить из "music/name/dir1/dir2/dirN/file.mp3" "name" используя шаблоны "=~ m/*/"

ЗНАЧИТ Я ДЕЛАЮ ТАК:
#!/usr/bin/perl -w
my $pid_part = q{music\/(.*)\/};
my $string = "music/name/dir1/dir2/dirN/file.mp3";

my($pid)=($string =~ m/$pid_part/);
print $pid,"\n";

НО ПРОГРАММА ВЫВОДИТ: "name/dir1/dir2/dirN", то есть программа начинает искать "/" c конца строки а не с начало.

ВОПРОС: как сделать так что бы "=~ m/*/" начинала искать с начало строки а не с конца и выводила "name".

ЗАРАНЕЕ БЛАГОДАРЮ ЗА ПОМОЩЬ!


Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "PERL поиск строки по шаблону =~m/*/"  +/
Сообщение от angra (ok) on 20-Авг-09, 18:42 
Ограничивайте жадность Quantifiers. Кусок из man perlre:

By default, a quantified subpattern is "greedy", that is, it will match as many times as possible (given a particular starting location) while still allowing the rest
       of the pattern to match.  If you want it to match the minimum number of times possible, follow the quantifier with a "?".  Note that the meanings don’t change, just
       the "greediness":

           *?     Match 0 or more times, not greedily
           +?     Match 1 or more times, not greedily
           ??     Match 0 or 1 time, not greedily
           {n}?   Match exactly n times, not greedily
           {n,}?  Match at least n times, not greedily
           {n,m}? Match at least n but not more than m times, not greedily


Итого: my $pid_part = q{music\/(.*?)\/};

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "PERL поиск строки по шаблону =~m/*/"  +/
Сообщение от Darktj email on 20-Авг-09, 19:29 
>Итого: my $pid_part = q{music\/(.*?)\/};

Спасибо! все работает на ок ;)


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "PERL поиск строки по шаблону =~m/*/"  +/
Сообщение от Darktj email on 20-Авг-09, 19:38 
ПО ХОДУ ВОЗНИК ЕЩЁ ОДИН ВОПРОСИК:
ЕСТЬ директория:
"music/name/dir1/dir2/dirN/file.mp3"

НУЖНО вытащить из "music/name/dir1/dir2/dirN/file.mp3" "name" используя шаблоны "=~ m/*/"
при этом исходная директория может выглядеть и так "images/name/dir1/dir2/dirN/file.jpg"
то есть нужно как то "my $pid_part = q{music\/(.*)\/}" задать или "music" или "images"

Я ПОПЫТАЛСЯ СДЕЛАТЬ ТАК:
#!/usr/bin/perl -w
my $pid_part = q{(music\/ || music1\/)(.*?)\/};
my $string = "music/name/dir1/dir2/dirN/file.mp3";

my($pid)=($string =~ m/$pid_part/);
print $pid,"\n";

НО РЕЗУЛЬТАТ ПУСТ!

ЗАРАНЕЕ БЛАГОДАРЮ ЗА ПОМОЩЬ!

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "PERL поиск строки по шаблону =~m/*/"  +/
Сообщение от Darktj email on 20-Авг-09, 19:45 
Попытался сделать так:

my $pid_part = q{(music\/|music1\/)(.*?)\/};

Но результат выводит: /music


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "PERL поиск строки по шаблону =~m/*/"  +/
Сообщение от Darktj email on 20-Авг-09, 19:48 
Решил проблему поставив вместо "()" "[]"
my $pid_part = q{[music|music1]\/(.*?)\/};

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

6. "PERL поиск строки по шаблону =~m/*/"  +/
Сообщение от Darktj email on 20-Авг-09, 19:55 
>Решил проблему поставив вместо "()" "[]"
>my $pid_part = q{[music|music1]\/(.*?)\/};

Сорри ступил проблема не решена!


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

7. "PERL поиск строки по шаблону =~m/*/"  +/
Сообщение от angra (ok) on 20-Авг-09, 20:03 
>(music\/|music1\/)

Ищет music/ или music1/, обычно такое делается проще:
my $pid_part = q{music1?\/(.*?)\/};
Но самое важное, что вы сделали лишний захват и perl естественно вам его вернул. Можно это обойти вот так:
my $pid_part = q{(?:music\/|music1\/)(.*?)\/};

>Решил проблему поставив вместо "()" "[]"

Метод научного тыка это конечно круто, но лучше сразу ищите себе другую профессию, скажем оператор ПК, там подобное ламерство только поощряется. Вы не решили проблему, а подобрали вариант проходящий вашу контрольную строку, но он также пройдет и такое
my $string = "c/name/dir1/dir2/dirN/file.mp3";
А уж на таком вообще весело станет:
my $string = "wtf/name/dir1/dir2/dirN/file.mp3";

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

8. "PERL поиск строки по шаблону =~m/*/"  +/
Сообщение от Darktj email on 20-Авг-09, 20:06 
спасибо огромное...

А про метод тыка - это потому что нигде не нашел нормальную русс. док по Перл!

У меня тоже вроде методом тыка что то получилось, но Ваш вариант лучше;)

#!/usr/bin/perl -w
#q{music\/(.*?)\/}
my $pid_part = q{(music|images)\/(.*?)\/};
my $string = "music/name/dir1/dir2/dirN/file.mp3";

my($pid, $str)=($string =~ m/$pid_part/);
print $pid, $str, "\n";


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

9. "PERL поиск строки по шаблону =~m/*/"  +/
Сообщение от angra (ok) on 20-Авг-09, 20:13 
Для захватов используются переменные $1, $2 итд. То есть в вашем варианте можно было сделать так:
$string =~ m/$pid_part/
print "$2 \n";

Но в целом использовать (шаблон) для чистой группировки без захвата неразумно, лучше (?:шаблон). Заодно последний вариант позволяет и флаги выставить например (?i:music|images) включит нечувствительность к регистру для этого куска регекса.

Для овладения регексами рекомендуется к прочтению http://oreilly.com/catalog/9780596528126/, есть переводы на русский, в том числе и в сети, но тут уже ищите сами ;)

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру