Perzistence
Když se podíváme na seznam úkolů, které by měl modul zvládat, zbývá poslední. Perzistentní uchovávání dat. Půjde jen o to, jak vhodně přepsat podprogram ziskej_zdrojovy_kod. Nadefinujeme si tedy proměnnou $cil, která bude jednoznačně identifikovat každý stažený soubor. $cil bude obsahovat cestu k souboru, kam zdrojový kód uložíme. Její tvar bude následující, podle toho, zda půjde o seznam zápasů nebo podrobnosti ke konkrétnímu zápasu.
/tmp/livescore_liga_odkaz_idzapasu
/tmp/livescore_liga
Metoda ziskej_zdrojovy_kod bude vypadat takto.
sub ziskej_zdrojovy_kod {
my($self, $liga, $odkaz_idzapasu) = @_;
my $url;
my $cil;
my $zdroj = undef;
local $/ = "";
if ($odkaz_idzapasu){
$url = "http://www.livescore.com/default.dll/Game?comp=$liga&game=$odkaz_idzapasu";
$cil = "/tmp/livescore_".$liga."_".$odkaz_idzapasu;
}else{
$url = "http://www.livescore.com/default.dll?page=$liga";
$cil = "/tmp/livescore_$liga";
}
#získání dat ze souboru nebo stažení; uložení dat do souboru
return $zdroj;
}
Za jakých okolností nyní budeme data stahovat a za jakých pouze kopírovat ze zálohy? Soubor musí splňovat dvě podmínky. Musí existovat a musí být mladší než nějaký interval definovaný uživatelem. Ještě předtím, než dokončíme metodu ziskej_zdrojovy_kod musíme do objektu přidat v konstruktoru parametr refresh, který implicitně nastavíme na 30 sekund. Pokud bude soubor starší, než kolik je $refresh bude stažen znovu.
$f->{"refresh"} = (int $refresh < 30) ? 30 : $refresh;
Vraťme se k metodě ziskej_zdrojovy_kod. Nyní již známe podmínky, za kterých soubor pouze zkopírujeme. Proměnnou $/ jsme nastavili proto, abychom načetli celý kód ze souboru najednou.
if (-e $cil and time() - (stat($cil))[9] <= $self->{"refresh"}){
open(R, $cil) or die "Nelze otevrit datovy soubor\n";
$zdroj = <R>;
close R;
}else{
#stáhneme data znovu a uložíme do zálohy
}
Nejsou-li tyto podmínky splněny, nezbývá, než data získat znovu z internetu. Vytvořenému souboru poskytneme plná práva, aby mohli zálohu načítat a aktualizovat jiní uživatelé. To sice dává možnost falšovat data, ale vzhledem k tomu, že je stejně získáváme z webu, tak se na ně spolehnout nelze.
unlink $cil;
my $mech = WWW::Mechanize->new();
$mech->get($url);
$zdroj = ($mech->get($url))->{"_content"};
open(W, ">$cil") or die "Nelze otevrit datovy soubor\n";
print W $zdroj;
close W;
chmod 511, $cil;
Modul hotov
Až na dokumentaci jsme právě dokončili základní část modulu. Zrekapitulujme si stručně, co všechno nyní vlastně dokáže.
- jsme schopni získat data - ať už seznam zápasů nebo seznam událostí k jednotlivým zápasům
- tato data dokážeme perzistentně uchovat
- z těchto surových dat dokážeme získat potřebné informace
- tyto informace dokážeme třídit na základě kritérií
Ukázka použití modulu
Sice tušíme, jak se bude modul používat, ale měli bychom si to pro lepší pochopení alespoň stručně ukázat.
V úvodu je třeba volat dvě metody - konstruktor a metodu na získání zápasů.
my $live = Livescore->new($liga);
my @vyhovujici = $live->ziskej_zapasy_dane_ligy;
Dále zpravidla vybereme pouze zápasy vyhovující nějakým kritériím
@kriteria = qw(manchester liverpool);
@vyhovujici = $live->najdi_zapas_podle_kriterii(\@vyhovujici, \@kriteria);
Nyní můžeme udělat několik věcí. Buď data jen zobrazit za základě dat v poli @vyhovujici nebo získat podrobnosti k zápasu a zobrazit až je. Je též možné tyto podrobnosti periodicky doplňovat a tím získat program na online sledování.
my @udalosti = $live->prenos($vyhovujici_liga, $vyhovujici_idzapasu);
Tím vším se ale budeme podrobně zabývat až příště. Pokud si chcete vytvořit vlastní program využívající modul Livescore ještě dříve, než to uděláme společně v dalším pokračování seriálu, můžete si celý modul stáhnout.