Dar vieno analitiko svetainė

Petras Kudaras

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 :)]