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


Автор: max1mus 4.12.2007, 21:54
Почему дання строчка не работает: print m%^(?<=($path))[^/]%; ?
Ошибку не выдает, но и не выводит ничего. В переменной $_ находится очередная строчка из файла, например "/abc/cba/123.txt".
Переменная $path в начале содержит "/".

Автор: JAPH 4.12.2007, 22:57
А чего вы добиваетесь? ^(?<=...) - В начале строки, перед которым стоит $path... Это как? Совпадение никогда не произойдёт ($path непустая, правда?)

Автор: max1mus 5.12.2007, 00:28
Хм... т.е. мнимый символ ^ работает на конструкцию [^/], а не на (?<=...) ?
Жлаь... а как мне можно воплотить это в жизнь? Задача такая, приведу пример: $_="/abc/cba/123.txt" $path="/abc/"
что нужно написать, чтобы эта команда вернула мне "cba"?

Автор: amg 5.12.2007, 07:09
Код

print $1 if m|^$path([^/]+)|; # Самое простое, понятное и быстрое
m|(?<=^$path)[^/]+| && print $&; # Расширенный синтаксис замедляет
print m|^$path([^/]+)|;
print m|(?<=^$path)([^/]+)|;

Кстати, последние два варианта могут ввести в заблуждение и ими лучше не пользоваться, или все время помнить, что какие функции вынуждает свои аргументы возвращать по возможности списковый контекст (print в их числе, что не очевидно), а какие нет. Например,
Код

print m|^$path([^/]+)|; # Напечатает "cba"
print length m|^$path([^/]+)|; # Напечатает 1, а не 3


Автор: max1mus 5.12.2007, 07:30
АААгромное спасибо! Работает  smile Как я только не додумался...  smile 

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