Интересности

[ Perl ]

26 Jun 2012

Сеть и математика

Существует модуль 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;