Forum Webscript.Ru

Программирование => Perl => Тема начата: monah от 27 Июня 2003, 21:53:50

Название: Объясните пожалуйста
Отправлено: monah от 27 Июня 2003, 21:53:50
Доброго времни суток.

Новичек, осваиваю регулярные выражения.
Не понимаю почему в случае глабального поиска операторы if и while работаю не одинаково.
Элементарный пример:

$s = "Privet, privet privet hi wow privet";
if ($s =~ /(privet)/gi) {
    print $1, "\\n";
}

Найдет всего один привет, если тупо if заменить на while Мартышка не потеряет ни одного привета.
ПОЧЕМУ?
Зарание благодарен.
Название: Объясните пожалуйста
Отправлено: vladsu от 28 Июня 2003, 00:27:43
Если просто перевести Агло-Перл на Русский, для "иф":

"Напечатать "privet"(в смысле, только раз), если он присутствует в строке(кол-во не важно)"

а для "вайл":

"Печатать "privet", пока он поподается в строке(т.е. сколько раз поподается столько и печатать)"
Название: Объясните пожалуйста
Отправлено: monah от 28 Июня 2003, 12:34:07
Таким образом, если я нахожу все url, например так:

/(\\baction|\\bhref)(.+?)"(.+?)"/

в документе и скидываю все тем же print  

print (HANDLER $3, "\\n");

в выходной файл, единственный способ зацепить 2 или более (к примеру) url в одной строке - использование while.
Так?
Название: Объясните пожалуйста
Отправлено: monah от 28 Июня 2003, 12:40:25
Извините, в конце регулярного выражения конечно   /../gi
Честно не понял про print.
Он же глупый: увидел - напечатал.
Или принт понимается этими операторами  неодинаково?
Название: Объясните пожалуйста
Отправлено: monah от 02 Июля 2003, 14:33:23
Можно ли подставлять в regex переменную, содержащую имя искомого файла?
Название: Объясните пожалуйста
Отправлено: Chs от 02 Июля 2003, 15:11:56
Можно.
Название: Объясните пожалуйста
Отправлено: monah от 02 Июля 2003, 17:05:17
Спасибо, работает :-)

Задача: найти образец в любой строке кроме закоментированной написал так:

  /^[^#]((\\w|\\W)*?)($pattern)/

если $pattern стоит в самом начале строки, он не находится как сделать так что бы находился и он?
Название: Объясните пожалуйста
Отправлено: monah от 02 Июля 2003, 17:35:29
Хотелось бы узать вот еще что:

применяю функцию find из File::Find

find(\\&wanted, @dir);

она вызывает указанную  функцию для каждого элемента в dir, как вырубить два первых: " . " и " .. " ?
Название: Объясните пожалуйста
Отправлено: Xander от 02 Июля 2003, 17:56:39
что-то вроде
continue if (/^\\.+$/);
Название: Объясните пожалуйста
Отправлено: Phoinix от 02 Июля 2003, 18:04:51
или просто удалить 2 первых значения...

splice (@dir, 0, 2);
Название: Объясните пожалуйста
Отправлено: Xander от 02 Июля 2003, 18:08:09
интересно, что быстрее :)
Название: Объясните пожалуйста
Отправлено: Phoinix от 02 Июля 2003, 18:15:37
Xander
Мне кажется быстрее считывать директорию без певрых двух значений... :-)
Название: Объясните пожалуйста
Отправлено: monah от 02 Июля 2003, 22:43:21
Спасибо, первые 2 элемента вырубил в начале options тупо:
if (($_ ne ".") and ($_ ne ".."))

Единственное что так это как научить regex
/^[^#]((\\w|\\W)*?)$pattern/

 видеть $pattern  в самом начале строки, правда это не нужно, файлы проверяются на наличие ссылок в них на имена файлов своих соседей и этим выражением, но так для развитьия...
Название: Объясните пожалуйста
Отправлено: vladsu от 03 Июля 2003, 13:18:29
Цитировать
Спасибо, первые 2 элемента вырубил в начале options тупо:
if (($_ ne ".") and ($_ ne ".."))

я бы это сделал так:

next if /^\\.?\\.$/;
Название: Объясните пожалуйста
Отправлено: monah от 03 Июля 2003, 14:13:21
Стоит ли по воробью бить из пушки?

такой меня сегодня вопрос озадачил (по молодости то):
вызываю скрипт из скрипта в надежде что он унаследует переменные родителя

$output = `./test.pl`;

в родителе есть $ARGV[0], так при выполнении test.pl ругается мол переменная не инициализирована.
И вообще, где обещенный интерпретатор командной строки?
Название: Объясните пожалуйста
Отправлено: monah от 03 Июля 2003, 14:20:50
да, а вот так все работает:

system("./test.pl $ARGV[0]");

Но, у меня на выходе в случае ОК только нуль, и опять - где инерпритатор, простите за тупость...
Название: Объясните пожалуйста
Отправлено: NeoNox от 03 Июля 2003, 14:34:24
Цитировать
monah:
и опять - где инерпритатор

Какой? Если Perl то which perl тебе поможет
Название: Объясните пожалуйста
Отправлено: monah от 04 Июля 2003, 17:16:28
Разобрался с интерпритатором командной строки все вроде работает...

Встала новая задача: проверять скрипты генерирующие HTML документы на предмет всяких тэгов и проч. Не подскажете подходящий валидатор?
Название: Объясните пожалуйста
Отправлено: Phoinix от 05 Июля 2003, 11:29:22
monah
Цитировать
проверять скрипты генерирующие HTML документы на предмет всяких тэгов и проч

Несколько не понял вопроса, где проверять теги? в в самом коде скрипта или в HTML который генерит этот скрипт?

IMHO не проще ли создать новую тему, ибо в этой уже непонятно о чем идет речь...
Название: Объясните пожалуйста
Отправлено: vladsu от 08 Июля 2003, 01:59:44
Не понятно, зачем ХТМЛу валидатор, это же не ИксМЛ и даже не ИксХТМЛ? Не знаю есть ли утилиты для этого, но в XMLSPY от Altova (http://www.altova.com/) это можно делать. Поищите, может у них есть отдельная утилита для этого.
Название: Объясните пожалуйста
Отправлено: monah от 08 Июля 2003, 12:13:01
Как не понятно?
Начну с начала: скрипты генерируют HTML документы, их (скрипты) надо проверять на коректность HTML кода - закрытые тэги и все такое. Для этого существуют программы - Валидаторы. Вот я ищу подходящий. Последнее время решил попробоветь подсунуть адрес одного моего скрипта прямо в форму на сайте http://htmlvalidatir.com, но не руками а из скрипта с помощью LWP.
Запрос пишу вроде корректно:
-------
my $req = POST  \'http://htmlvalidatir.com/php/onlinecheck.php\',
                         [ name => \'url\', value => \'http://some/path\' ];
и вывожу итог на экран:

print $res->content;

В итоге анализируя полученный документ оказывается что данные небыли переданы, будто я вовсе не заполнял поля формы!
В чем ошибка?
Название: Объясните пожалуйста
Отправлено: monah от 08 Июля 2003, 12:14:33
Извините адрес не корректен :
http://www.htmlvalidator.com