Operátor <>
Tento operátor lze použít ve dvou variantách v závislosti na argumentech. Pokud mu předáme ovladač nebo jednoduchou skalární hodnotu (která obsahuje buď jméno ovladače, typeglob se jménem ovladače, nebo odkaz na typeglob se jménem ovladače ve tvaru $jmeno), ve skalárním kontextu přečte z ovladače, jehož jméno je uvedeno uvnitř špičatých závorek, další řádek a tento řádek vrátí (i s případným znakem konce řádku). V případě, že se nacházíme na konci souboru či v případě chyby vrátí nedefinovanou hodnotu. V seznamovém kontextu jsou vráceny všechny řádku od aktuální pozice v souboru až do konce souboru tak, že každý prvek seznamu odpovídá jednomu načtenému řádku za souboru.Kde končí řádek (přesněji řečeno vstupní záznam) je definováno obsahem pro¬měnné
$ / ($INPUT_RECORD_SEPARATOR). Implicitně je tato proměnná nastavena na hodnotu , ale je možné do ní přiřadit libovolný řetězec. Máme-li například odstavce v textu odděleny jedním prázdným řádkem, a chceme-li, aby byl najednou přečten celý odstavec, nastavíme tuto proměnnou na řetězec .
Jakýkoliv složitější výraz uvnitř operátoru je brán jako vzor pro jméno souboru, který se předá funkci glob. Návratová hodnota této funkce je tvořena seznamem jmen souboru odpovídajících zadanému vzoru, a následně je vrácena operátorem <>. Tato činnost se provádí i v případě, že se uvnitř špičatých závorek nachází prvek pole nebo hashe (což jsou také skalární hodnoty), ale i proměnná ve tvaru ${jméno}. To je také způsob, jak vynutit tento způsob zpracování výrazu uvnitř <> (tzn. jak získat jména souboru).
Print “Soubory s příponou doc:\n”;
Print “ $_\n“ for <*.doc>;
Zvláštní chování má operátor <> v případě, že mu není zadán argument. V tomto případě operátor prochází soubory, jejichž jména jsou obsažena v poli @ARGV. Toto pole obsahuje seznam argumentu zadaných skriptu na příkazové řádce. Je-li prázdné, pracuje se se souborem -. Tento speciální soubor reprezentuje standardní vstup v případě použití pro čtení, nebo standardní výstup při použití pro zápis.
Soubory jsou zpracovány tak, jako by se jednalo o jeden soubor. Proměnná $. obsahující číslo aktuálně zpracovávané řádky se po otevření nového souboru nevy¬nuluje (soubory totiž nejsou explicitně uzavírány).
// Spoštěno s argumenty ’data1’, ’data2’
While ($radek = <>) {
Print “$.: $radek“;
}
// Vytiskne:
1: data1 – radek1
2: data1 – radek2
3: data2 – radek1
4: data2 – radek2
5: data2 – radek3
Nejsou-li na příkazové řídce žádné argumenty, pracuje se se souborem -, tzn. zpracovává se standardní vstup.
While ($radek = <>) {
Print uc $radek;
}
//Vytiskne načtené řádky velkými písmeny
A to by bylo pro dnešek všechno. V dalším díle se podíváme na operátor šipka, operátor autoinkrementu a autodeinkrementu. V případě jakýchkoliv dotazů mě kontaktujte na email: habrman@banan.cz.
Autor: Robert Habrman