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"; # iš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