Perlo skaitymo iš bylų būdai
Perlas leidžia nuskaityti duomenis iš bylų daugybe būdų, kai kurie
ganėtinai bjaurūs ir nenaudotini. Štai kad ir šis, sutinkamas
dažniausiai:
{
local $/ = undef;
open FH, "<$byla";
$duomenys = <FH>;
close FH;
}
Teigiamos pusės: visiems įprasta. Iš kart nuskaito duomenis iš bylos
nenaudojant tarpinių masyvų.
Neigiamos pusės: $duomenys negali būti leksinis
kintamasis, aprašytas su my, nes specialiai reikia
sukurti bloką tam kam lokalizuotume $/
Kitas dažnas pavyzdys:
@ARGV = ($byla);
my $duomenys = join '', <>;
Teigiama: Trumpa ir aišku. Neigiama: užteršia
@ARGV masyvą, sunku gaudyti klaidas, neefektyvu
esant didelioms byloms.
my $duomenys = `cat $byla`;
Teigiama: Labai trumpa. Labai aišku shell programuotojams.
Neigiama: Prastas saugumas – bylos pavadinime gali būti paslėptos
shell komandos. Sukuriamas naujas procesas, todėl kodo
efektyvumas mažas. Sunku gaudyti klaidas. Neportabilu.
open my $fh, '<', $byla or die $!;
read $fh, my $duomenys, -s $fh or die $!;
close $fh;
Teigiama: Lengva rast klaidas, gana trumpa, nenaudoja per daug Perlo santrumpų,
visur naudoja tik leksinius vietinius kintamuosius. Neigiama: kaip ir nėra
use Sys::Mmap;
new Mmap my $duomenys, -s $byla, $byla or die $!;
Teigiama: Labai greitas duomenų pasiekimas, nes duomenys nenuskaitomi iš bylos iki paskutinės akimirkos kai jų prisireikia.
Keičiant kintamąjį $duomenys automatiškai keičiasi ir bylos turinys (šis kintamasis „pririštas“ prie bylos). Neigiama: reikia modulio Sys::Mmap, veikia tik UNIC platformoje, sunku suprasti ne UNIX ir C programuotojams.
[Versta iš PerlDesignPatterns – pamečiau dabar nuorodą, gal darbe atknisiu :)]