Автор Тема: Объясните пожалуйста  (Прочитано 7132 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн monah

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 12
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Объясните пожалуйста
« : 27 Июня 2003, 21:53:50 »
Доброго времни суток.

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

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

Найдет всего один привет, если тупо if заменить на while Мартышка не потеряет ни одного привета.
ПОЧЕМУ?
Зарание благодарен.

Оффлайн vladsu

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 271
  • +0/-0
  • 0
    • Просмотр профиля
    • http://vladislavsurguchev.eu/
Объясните пожалуйста
« Ответ #1 : 28 Июня 2003, 00:27:43 »
Если просто перевести Агло-Перл на Русский, для "иф":

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

а для "вайл":

"Печатать "privet", пока он поподается в строке(т.е. сколько раз поподается столько и печатать)"
----------------------------------------------
Мой сайт чёрно-белых фотографий из разных уголков мира тут

Оффлайн monah

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 12
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Объясните пожалуйста
« Ответ #2 : 28 Июня 2003, 12:34:07 »
Таким образом, если я нахожу все url, например так:

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

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

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

в выходной файл, единственный способ зацепить 2 или более (к примеру) url в одной строке - использование while.
Так?

Оффлайн monah

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 12
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Объясните пожалуйста
« Ответ #3 : 28 Июня 2003, 12:40:25 »
Извините, в конце регулярного выражения конечно   /../gi
Честно не понял про print.
Он же глупый: увидел - напечатал.
Или принт понимается этими операторами  неодинаково?

Оффлайн monah

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 12
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Объясните пожалуйста
« Ответ #4 : 02 Июля 2003, 14:33:23 »
Можно ли подставлять в regex переменную, содержащую имя искомого файла?

Оффлайн Chs

  • Perl программер
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1108
  • +0/-0
  • 2
    • Просмотр профиля
    • http://chs.now.at/
Объясните пожалуйста
« Ответ #5 : 02 Июля 2003, 15:11:56 »
Можно.
2B OR NOT 2B = FF

Оффлайн monah

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 12
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Объясните пожалуйста
« Ответ #6 : 02 Июля 2003, 17:05:17 »
Спасибо, работает :-)

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

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

если $pattern стоит в самом начале строки, он не находится как сделать так что бы находился и он?

Оффлайн monah

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 12
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Объясните пожалуйста
« Ответ #7 : 02 Июля 2003, 17:35:29 »
Хотелось бы узать вот еще что:

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

find(\\&wanted, @dir);

она вызывает указанную  функцию для каждого элемента в dir, как вырубить два первых: " . " и " .. " ?

Оффлайн Xander

  • санитар леса
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1780
  • +0/-0
  • 2
    • Просмотр профиля
Объясните пожалуйста
« Ответ #8 : 02 Июля 2003, 17:56:39 »
что-то вроде
continue if (/^\\.+$/);
•••Jah\'d never let us down!•••

Оффлайн Phoinix

  • RW
  • Ветеран
  • *****
  • Сообщений: 1097
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phoinix.ucoz.ru
Объясните пожалуйста
« Ответ #9 : 02 Июля 2003, 18:04:51 »
или просто удалить 2 первых значения...

splice (@dir, 0, 2);

Оффлайн Xander

  • санитар леса
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1780
  • +0/-0
  • 2
    • Просмотр профиля
Объясните пожалуйста
« Ответ #10 : 02 Июля 2003, 18:08:09 »
интересно, что быстрее :)
•••Jah\'d never let us down!•••

Оффлайн Phoinix

  • RW
  • Ветеран
  • *****
  • Сообщений: 1097
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phoinix.ucoz.ru
Объясните пожалуйста
« Ответ #11 : 02 Июля 2003, 18:15:37 »
Xander
Мне кажется быстрее считывать директорию без певрых двух значений... :-)

Оффлайн monah

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 12
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Объясните пожалуйста
« Ответ #12 : 02 Июля 2003, 22:43:21 »
Спасибо, первые 2 элемента вырубил в начале options тупо:
if (($_ ne ".") and ($_ ne ".."))

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

 видеть $pattern  в самом начале строки, правда это не нужно, файлы проверяются на наличие ссылок в них на имена файлов своих соседей и этим выражением, но так для развитьия...

Оффлайн vladsu

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 271
  • +0/-0
  • 0
    • Просмотр профиля
    • http://vladislavsurguchev.eu/
Объясните пожалуйста
« Ответ #13 : 03 Июля 2003, 13:18:29 »
Цитировать
Спасибо, первые 2 элемента вырубил в начале options тупо:
if (($_ ne ".") and ($_ ne ".."))

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

next if /^\\.?\\.$/;
----------------------------------------------
Мой сайт чёрно-белых фотографий из разных уголков мира тут

Оффлайн monah

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 12
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Объясните пожалуйста
« Ответ #14 : 03 Июля 2003, 14:13:21 »
Стоит ли по воробью бить из пушки?

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

$output = `./test.pl`;

в родителе есть $ARGV[0], так при выполнении test.pl ругается мол переменная не инициализирована.
И вообще, где обещенный интерпретатор командной строки?

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28