![]() |
|
![]() |
||||||
![]() |
Допустим есть программа на perl и необходимо чтобы выполнение прерывалось по истечении таймаута времени выполнения. Делается это так: Читать дальше... ![]() Этот пример на языке перл (perl) позволяет вам преобразовать русский текст в транслит (т. е. на русский написанный латинскими буквами) Читать дальше... Задача сводилась к тому, чтобы по мере обработки читать с файла новые url, асинхронно запрашивать страницы и записывать HTTP ответы в файлы. Конечно можно было все сделать последовательно, но уж больно много времени потребовалось бы на это.
Как оказалось, для организации такого конвейера более подходит модуль HTTP::Async, а не LWP::Parallel::UserAgent. Вот примерный код, который использовался для этого (работа с файлами опущена): Читать дальше... Один из подходов, если в системе установлен консольный браузер lynx:
$html_code = `lynx -source $url`;
$text_data = `lynx -dump $url`;
Модули CPAN libwww-perl (LWP) дают более мощное решение. Они не требуют lynx, но тоже могут работать через прокси: Читать дальше... Создайте сообщение типа «multipart» (то есть, с вложениями). MIME::Lite также включает метод для отправки
$msg->send;
По умолчанию используется sendmail, но можно настроить использование SMTP через Net::SMTP. Читать дальше... Хотя можно использовать модуль Mail::Folder из CPAN (часть пакета MailFolder) или Mail::Internet (часть пакета MailTools), часто это перебор. Вот программа для сортировки почты. Читать дальше... Пакет MIME-Base64 из CPAN работает с MIME/BASE64 и MIME/QP. Декодирование BASE64 производится проще некуда:
use MIME::Base64;
$decoded = decode_base64($encoded);
Пакет MIME-Tools из CPAN поддерживает выборку и декодирование вложений и самого текста сообщения.
Если строка для декодирования небольшая (меньше 84 байт), то после незначительного преобразования можно использовать прямое решение с форматом u функции unpack(): Читать дальше... Можно сделать это вручную:
while $string =~ s/\t+/' ' x (length($&) * 8 - length($`) % 8)/e;
Либо можно использовать модуль Text::Tabs из стандартной поставки Perl: Читать дальше... Используйте хеши. Вот код для одновременного нахождения симметрической разности и пересечения (Заметьте, что это симметрическая разность, то есть, множество элементов, которые принадлежат A и B, но не A и B одновременно. Это как исключающее «или».). Предполагается, что каждый элемент встречается в исходных массивах единожды: Читать дальше... algorithms, arrays, diff, perlЕсли вы знаете, где находятся колонки с данными, то используйте substr:
my $column = substr( $line, $start_column, $length );
Вы можете использовать split, если колонки разграничены пробелами или другими разделителями, если таковые не могут быть частью данных. Читать дальше... ![]() Это не то, что можно сделать одним регулярным выражением, каким бы оно ни было сложным. Для поиска чего-то между двумя символами шаблон вроде /x([^x]*)x/ даст в $1 промежуточную подстроку. Для различных ограничителей нужно что-то вроде /alpha(.*?)omega/. Но ни один из этих шаблонов не работает со вложенностью. Для сбалансированных выражений с разделителями (, {, [ или < используйте модуль Regexp::Common из CPAN. В остальных случаях придется писать парсер.
Если вы действительно хотите написать парсер, то есть ряд модулей и странных штук, которые сильно упростят вам жизнь. В CPAN есть Parse::RecDescent, Parse::Yapp и Text::Balanced; также имеется программа byacc. Начиная с Perl 5.8, в стандартную поставку входит Text::Balanced. Простой подход с разрушением строки изнутри, который стоит попробовать — последовательная выборка компонентов с наибольшей вложенностью: while (s/BEGIN((?:(?!BEGIN)(?!END).)*)END//gs) { # сделать что-то с $1 } Более хитрый подход — переложить эту работу на движок регулярных выражений Perl. Вот код, который скорее годится на Конкурс запутанных исходников, но он действительно работает: Читать дальше... |
Меню
Подписка на RSS:
Поиск
Облако тегов
.net
array
asp
bash
browser
charset
check
class
clean
convert
count
create
css
curl
database
date
delete
directory
download
element
email
equivalent
extension
file
find
form
format
function
get
height
html
http
ie
image
javascript
jquery
load
mysql
number
page
perl
php
random
scriplet
send
shell
size
sql
string
text
time
url
utf8
variable
vb
visual basic
width
window
xml
xslt
|
![]() |
![]() |
![]() |
||
![]() |
![]() |