Сеть и математика
Существует модуль Socket, который позволяет получить низкоуровненвый доступ к сетевым протоколам. Чтобы так не углубляться придумали модуль LWP::Simple
LWP::Simple
use LWP::Simple;
$pg=get $ARGV[0];
$fnm='index.html';
open FD, ">$fnm" or die "Can`t open $fnm:$' ";
print FD $pg;
close FD or die "Can`t close";
Отлично, теперь есть сохранятель страниц.
А как сделать зеркало?
Попробуем…
#!/usr/bin/perl -w
use LWP::Simple;
$_=get $ARGV[0];
$dirnm=$ARGV[0];
$dirnm=~s/http:\/\///;
$fnm='index.html';
mkdir $dirnm;
open FD, ">$dirnm/$fnm" or die "Can`t open $fnm:$' ";
$_=~s/<a href="($ARGV[0])"/<a href="$dirnm"/g;
print FD;
close FD or die "Can`t close";
но самих файлов по этим внутренним ссылкам нет.
Тут было некоторое регулярное выражение, а потом вызов для каждой ссылки. Причем можно сделать как цикл вызовов функции по ссылке, Так и рекурсивный вызов самого скрипта, меняя аргумент.
Самый короткий способ(но читерский и только для UNIX)
#!/usr/bin/perl -w
system "wget -r $ARGV[0]";
HTML::Parse
#!/usr/bin/perl -w
use LWP::Simple;
use HTML::Parse;
print parse_html(get ($ARGV[0]))->format;
Выводит на экран отформатиррованный сайт.
URI::URL
#!/usr/bin/perl -w
use LWP::Simple;
use HTML::Parse;
use HTML::Element;
use URI::URL;
$html = get $ARGV[0];
$parsed_html = HTML::Parse::parse_html($html);
for (@{ $parsed_html->extract_links( ) }) {
$link=$_->[0];
$url = new URI::URL $link;
$full_url = $url->abs($ARGV[0]);
print "$full_url\n";
}
Математика
Задача на полиномы
Пусть есть скриптик, который преобразовывает полином из неправильной записи (например: 2x2y2) в стандартную: 2x^2y^2
Как будем хранить полином?
package Polynom;
sub canon{
my ($cl,$plnm)=@_;
$plnm=~s/\*//g;
my %me=();
$plnm=~s/^(\d+)//;
$k=$1 || 1;
$plnm=~s/(\w)(\d+)?/($1)x(defined ($2)?$2:1)/ge;
$me{$plnm}=$k;
return %me;}
1;