Bazinės įvedimo/išvedimo operacijos

 

Nei viena programa negali funkcionuoti be informacijos apsikeitimo su aplinka t. y. duomenų nuskaitymo ir išvedimo į failą ar konsolę, operacinės sistemos komandų įvykdymo ir t. t. PERL programavimo kalba ne išimtis. Čia, kaip ir C/C++ egzistuoja tie patys standartiniai srautai bei juos atitinkantys failų deskriptoriai  STDIN (standard input), STDOUT (standard output), STDERR (standard error output) apie kuriuos ir bus kalbama šiame skyriuje.

Paleidžiant PERL ar bet kurią kitą programą atidaromi keletas standartinių failų skirtų:
      - duomenų įvedimui (tai failas susijęs su standartiniu įvedimo įrenginiu klaviatūra, o jo deskriptorius vadinamas STDIN);
      - duomenų išvedimui (tai failas susijęs su standartiniu išvedimo įrenginiu monitoriumi, o jo deskriptorius vadinamas STDOUT); 
      - klaidų pranešimų išvedimui (tai failas susijęs su standartiniu išvedimo įrenginiu, o jo deskriptorius vadinamas STDERR).

PERL programą iš komandinės eilutės galima paleisti su parametrų sąrašu, pavyzdžiui:

$ perl program.pl par1 par2 par3

Parametrai gali būti ir raktai, prasidedantys ženklu "-" ( -v  -r ). Visi parametrai yra saugomi specialiame vidiniame masyve @ARGV , kurio elementai gali būti nuskaitomi.



Įvedimo operacija <>

Įvedimo operacijos <> paskirtis - nuskaityti eilutę iš failo, kurio deskriptorius yra operacijos operandas t.y. nurodytas tarp <>. Šiame skyriuje panagrinėjamas tik vienas iš įvedimo operacijos atvejų t.y. nuskaitymas iš STDIN arba failų nurodytų komandinėje eilutėje paleidžiant PERL programą. Tam naudojama įvedimo operacija be operando. 

Įvedimo operacija iš standartinio įvedimo įrenginio gali būti atliekama naudojant skaliarinį kontekstą:

$var = <STDIN>      # nuskaitoma viena eilutė iki naujos eilutės simbolio (\n nuskaitomas taip pat)

arba masyvo kontekste
@a = <STDIN>;   # nuskaitomos visos eilutės. Kiekviena eilutė - atskiras masyvo elementas 

Dažnai naudojamas toks ciklas, skirtas visos informacijos nuskaitymui iš STDIN:

while (defined($line = <STDIN>)) {
    # apdorojamas kintamasis $line
    # print $line; (kaip pavyzdys) 
}

Jei iš STDIN nuskaityta eilutė nepriskiriama kokiam nors programuotojo sukurtam kintamajam, tuomet ši eilutė saugoma specialiame kintamajame $_ . Pasinaudojus šia savybe, galima  sutrumpinti ir optimizuoti PERL programinį kodą neįvedinėjant papildomų kintamųjų. Pavyzdžiui: 

while (<STDIN>) {              # vietoje "while(defined($line = <STDIN>)) {"
    chomp;                     # vietoje "chomp($line);"
    # kitos operacijos su $_
}

Panagrinėkime įvedimo operaciją, kai nenaudojamas operandas <>. Naudojant tokia įvedimo operacijos sintaksę duomenys gali būti nuskaitomi ne tik iš STDIN, bet ir iš failo, nurodyto komandinės eilutės parametruose. Taigi pirmiausiai yra patikrinamas ar netuščias masyvas @ARGV. Jie jis tuščias, tai $ARGV[0] = "-" ir įvedimo operacija laukia kol vartotojas įves duomenis iš STDIN. Jei @ARGV netuščias - tai masyvo elementai traktuojami kaip failų pavadinimai ir juose esantys duomenys yra nuskaitomi eilutėmis. Pavyzdžiui program.pl failas atrodo taip:

#!/usr/bin/perl
while (<>) {
    print $_;
}

Paleidžiant šį failą kaip parodyta aukščiau bus nuskaitytos visos eilutės iš failų  par1 par2 par3 bei išvestos į standartinį  išvedimo įrenginį. Operaciją <> bei masyvą  @ARGV galima surišti nebūtinai tik per komandinę eilutę. Masyvas @ARGV gali būti apibrėžiamas pačioje programoje nurodant failų pavadinimus, kuriuos reikia nuskaityti. Pavyzdžiui:

@ARGV = ("aaa","bbb","ccc");
while (<>) {                    # nuskaitomi failai aaa, bbb, ccc
    print "this line is: $_";   # išvedimas
}


Operacija <> dar gali būti naudojama norint gauti visų failų pavadinimus, atitinkančius norimą šabloną. Skaliariniame kontekste kintamajam priskiriamas pirmasis rastas failas, masyvo kontekste - visų failų, atitikusių užsiduotą šabloną, sąrašas. Pavyzdžiui:

$first = <*.pl>;        # pirmas rastas failas su išplėtimu *.pl.
@files = <*.pl>;        # failų, turinčių plėtinius *.pl  sąrašas

while (<*.pl>)  {
   print $_;
}


Išvedimas į STDOUT

PERL naudoja  print()  ir printf()  funkcijas informacijos išvedimui  į standartinį išvedimo įrenginį. Panagrinėkime jas.

print  - funkcija, skirta neformatuotam išvedimui į failą ar standartinį išvedimo įrenginį STDOUT.

Sintaksė
     print [Deskriptorius] Sąrašas;

Deskriptorius čia suprantamas kaip failo deskriptorius į kurį funkcija išveda informaciją, pateiktą sąraše. Deskriptorius sukuriamas naudojant funkciją open(), bet apie ją bus kalbama kitame skyriuje. Jei failo deskriptorius praleistas, tuomet išvedimas atliekamas į STDOUT. Funkcija  print atlieka išvedimą nepridėdama jokių papildomų simbolių, todėl reiktų nepamiršti metasimbolio "\n", norint, kad kursorius po išvesto sarašo būtų sekančioje eilutėje. Pavyzdžiui:

print "Hello world!\n"; # vedama eilutė Hello world!
print (2+3),"hello";    # išvedamas, ignoruojama "hello" dėl skliaustų
print ((2+3),"hello");  # išvedama 5hello
print 2+3,"hello";      # išvedama 5hello

printf - funkcija, skirta formatuotam išvedimui į failą ar standartinį išvedimo įrenginį STDOUT.

Sintaksė
     printf [Deskriptorius] Formatas Sąrašas;

Deskriptorius, kaip ir funkcijos print atveju, nurodo failą ar įrenginį į kurį reikia išvesti informaciją, formatas apibrėžia formatavimą, o sąraše pateikiama išvedama informacija eilučių ar kintamųjų pavidalu.. Funkcija printf labai panaši į C kalbos analogišką funkciją. Formatas apibrėžiamas lygiai taip pat kaip ir C kalboje. Pavyzdys:

printf "%15s %5d %10.2f\n", $s, $n, $r;  # išvedama eilutė, sveikas ir realus skaičiai


Į turinį