Рубрика архива: Perl

RegExp

Как обычно, появилась интересная задачка по регулярным выражениям, требуется написать некоторый макрос, который при встрече в шаблоне текста будет заменяться определенными значениями сформированными из параметров макроса. И чтобы было не совсем тривиально будет еще упрощенная версия этого же макроса.

упрощенный макрос link{«text»,id} и полная версия link{«text»,id}img{id}, результат их работы будет таков
макрос номер 1:
<a href="link_id">text</a>
макрос номер 2:
<a href="link_id">text<img src="img_id"></a>

регулярное выражение для полной версии макроса
/link\{«(.*?)»,([0-9]+)?)\}img\{([0-9]+?)\}/
и соответственно для упрощенной
/link\{«(.*?)»,([0-9]+?)\}/

пример шаблона:
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed arcu link{«lorem»,10}img{20}, semper id dictum sit amet, egestas a dui. Donec condimentum link{«gravida ullamcorper»,5}.

результат работы регулярного выражения для полной версии макроса lorem, 10, 20
результат работы для упрощенной: lorem»,10}img{20}, semper id dictum sit amet, egestas a dui. Donec condimentum link{«gravida ullamcorper, 5

Прямо скажем, не то что я ожидал увидеть. Пробовал разные варианты ограничить жадность квантификаторов, даже всякие магически пасы в виде ?!, ?!= и прочих, пока без просвета.

печать самого себя

#!/usr/bin/perl
# скрипт печатает сам себя

open FL, $0 || die("ERROR: $!");
print while <FL>;
close FL;

задачка 2.

*как выяснилось, решение корректно на числах одного порядка

есть 10 миллиардов записей в файле, каждая запись это число типа double, требуется найти минимальное значение из 10% максимальных.
Подробнее »

задачка 1.

Дан текстовый файл. Необходимо выделить из него 50 наиболее часто повторяющихся строк.
Подробнее »

REGEXP, собрать ссылки со страницы

Если требуется собрать все ссылки которые есть на странице то поможет следующее регулярное выражение:

{<a.*?\s{1}href=\s*(&#91;"'&#93;)(.+?)\1.*?>}

оно ищет href который может быть обрамлен кавычками, слева от него может быть любое кол. символов до начала тега, но обязательно будет пробел, справа после закрывающей URL кавычки может быть любое количество символов или сразу закрываться тег.

следующий код собирает в скалярный массив все ссылки.

while($a=~m{<a.*?\s{1}href=\s*(&#91;"'&#93;)(.+?)\1.*?>}oig){
	push(@m,$2) if $2;
}

или краткая форма:

push(@m,$2) while($a=~m{<a.*?\s{1}href=\s*(&#91;"'&#93;)(.+?)\1.*?>}ig);

REGEXP, собрать все email’ы со страницы

Вот, простая и дубовая конструкция, лишенная красоты и лаконичности присущей перлу, но зато очевидная на 100%

while($a=~m{=(['"])mailto:(.+?)\1.*?>}ig)
{
	push(@m,$2) if $2;
}

это регулярное выражение ищет в тексте конструкцию вида «mailto:blablabla», где кавычки могут быть как одинарные так и двойные, первые скобки нужны для того чтобы найти и определить в переменную $1 тип кавычек в которых находится искомое, ну а вторые нужны чтобы в переменную $2 положить сам почтовый адрес.

более краткая запись:

push(@m,$2) while($a=~m{=(['"])mailto:(.+?)\1.*?>}ig);

hello world

Мое знакомство с программированием под web началось в далеком 2001 году, за достоверность описываемых событий я уже ручаться не могу, очень многое успело наложиться на память с тех времен. Но исписаны были килобайты кода, некрасивого, нерабочего, и просто опасного. Но любовь к моей первой веб hello world я сохраняю до сих пор.

#!/usr/bin/perl
print "Hello world\n\n";