ARCHIV |
|||||||||||||||||||||||||||||||
Software (10844)
Distribuce (131)
Skripty (697)
Menu
Diskuze
Informace
|
Perl (29) - Úvod k práci se souborySoubory jsou prvním způsobem komunikace programu s okolím, kterým se bude seriál zabývat. Soubory jsou místa k ukládání nebo přenosu dat. Můžeme s nimi různými způsoby manipulovat. Právě tím se budeme v několika následujících dílech zabývat. OvladačePráce se soubory spočívá ve vytvoření ovladače, což je datový typ, který potom soubor zprostředkovává. Pomocí něj lze do souboru zapisovat nebo naopak data získávat. Narozdíl od dosud poznaných datových typů nemá ovladač souboru žádný prefix. To způsobuje, že s ním musíme pracovat v určitých případech trochu jinak - například při předávání podprogramům, kopírování apod. Obvykle musíme použít typegloby. Důležité je, že práce s ovladačem je univerzální, ať se jedná a jakýkoliv zdroj dat. Nezáleží na tom, zda jde o socket, textový soubor, výstup roury nebo standardní vstup. Existují 3 standardní ovladače, které jsou vždy automaticky otevřeny. Neodkazují na soubor, ale na výstup (obrazovku) nebo vstup (klávesnici): STDIN (standardní vstup), STDOUT (standardní výstup) a STDERR (standardní chybový výstup - jde o výpis hlášení, která nejsou ve zdrojovém kódu - například chyby). Otevření ovladačeOvladač je v případě textových souborů vytvářen funkcí open nebo sysopen. Později, až se setkáme například s prostředky meziprocesorové komunikace, zjistíme, že lze ovladače vytvářet i pro jiné soubory než textové. Nejjednodušší volání funkce open má 2 parametry - jméno ovladače a jméno otvíraného souboru (pozor na přístupová práva). Jméno souboru může být absolutní i relativní. Před jménem souboru je třeba ještě dát najevo, jak bude soubor otevírán. Na výběr je jedna z následujících možností. čteníUvedením < otevřeme soubor jen pro čtení:
open(DATA, "<soubor");
< je nastaveno implicitně, takže zápis bez určujícího znaku bude ekvivalentní.
open(DATA, "soubor");
Teď máme k dispozici ovladač DATA, se kterým můžeme pracovat stejně jako s kterýmkoliv jiným ovladačem. zápisChcete-li zapisovat do souboru pomocí znaku > a soubor ještě neexistuje, vytvoří se. Pokud ale již existuje, bude původní obsah bez potvrzení smazán. Existuje metoda, která umožňuje vyšší kontrolu nad souborem. Tou jsou operátory pro zjišťování informací o souborech. V některém blízkém díle se jimi budeme také zabývat.
open(DATA, ">soubor");
přípisSkrze ovladač pro přípis můžeme zapisovat, ale nikoliv mazat. Text se zapisuje na konec souboru. Pokud soubor neexistuje, vytvoří se.
open(DATA, ">>soubor");
standardní výstupOtevření dalšího ovladače pro standardní výstup se dá využít například tam, kde se program až za běhu rozhoduje, kam bude zapisovat. Ovladač se vytváří jako zápis do souboru -.
open(DATA, ">-");
standardní vstupA pro úplnost ještě dodejme, jak se vytvoří ovladač pro standardní vstup:
open(DATA, "<-");
Znak < je opět nepovinný.
open(DATA, "-");
rouryOvladač jako zdroj dat může stejně dobře obsahovat i výstup nějakého shellového příkazu. Nyní přesměrujeme výstup příkazu ls / do ovladače a ovladač tak bude zpřístupňovat jména adresářů v kořenovém adresáři. Tentokrát se mód nepíše před název souboru ale až za něj.
open(DATA, "ls / |");
Pokud chceme naopak nějaký výstup přesměrovat na vstup - například na vstup příkazu more, použijeme zápis:
open(DATA, "| more");
Praktickým příkladem použití roury může být program, který odešle na danou adresu email:
$to = "nekdo\@nekde.cz"; zápis (přípis) a čtení zároveňPro vytvoření ovladače umožňujícího zápis i čtení je třeba před módy <, > nebo >> připsat znak +. U textových souborů není výskyt takových ovladačů příliš častý. Tento přístup se používá hojně například při socketové komunikaci, kdy posíláme i přijímáme data jediným kanálem.
Konkrétně:
open(DATA, "+<soubor");
verze se 3 argumentyMód lze uvést jako samostatný argument. Následující zápis funguje pro všechny módy. Pokud takto chcete použít rouru, musíte dát najevo jestli bude na začátku (|-) nebo na konci (-|).
open(DATA, ">>", "soubor");
kopie ovladačůZa módy >, >>, <, +>, +>> a +< lze užít ampérsand. Tím vznikne stejný ovladač jako ovladač, jehož jméno je za ampérsandem.
open(OUT, ">&STDOUT");
Ovladač OUT posílá nyní data stejně jako STDOUT na standardní výstup. Vytváření ovladačů funkcí sysopensysopen podobně jako open otevírá soubory, ale poskytuje nad nimi lepší přehled. Jako argumenty přijímá název ovladače, jméno souboru a příznaky oddělené operátorem |, které určují způsob otevření souboru.
Chceme-li například do souboru připisovat a v případě, že neexistuje, jej vytvořit, funkce sysopen bude mít následující tvar:
sysopen(DATA, "soubor", O_WRONLY | O_CREAT | O_APPEND);
Zrušení ovladačeK zavření ovladače slouží příkaz close:
close DATA;
V případě, že je ovladač na konci programu ještě otevřený, měl by se zavřít automaticky sám. Je dobré soubor nenechávat zbytečně dlouho otevřený a zavřít ho vždy, jakmile to je možné. Nikdy bychom třeba neměli nechávat otevřený soubor, jestliže program čeká na standardní vstup. Práce s datyNyní si na několika příkladech ukážeme práci s otevřenými ovladači. Máme-li soubor otevřený pro čtení, můžeme k datům přistupovat přes nám již známý diamantový operátor. Jako 1. a nejjednodušší příklad napíšeme program, který opíše soubor data.txt na výstup.
open(DATA, "data.txt"); print je zde voláno v seznamovém kontextu. V každém prvku seznamu je řádek. Zkusme to samé s tím rozdílem, že zavoláme print opakovaně ve skalárním kontextu:
open(DATA, "data.txt"); Teď vytvořme (hodně zjednodušenou) analogii příkazu cp. Bude umět jen kopírovat soubor do jiného. Oba soubory budou zadány. Naše verze zatím nebude přijímat ani argumenty z příkazového řádku. K tomu se dostaneme až v díle o spolupráci s příkazovým řádkem.
my $zdroj; Prakticky veškerá činnost probíhá na jediném řádku, v němž kopírujeme jeden soubor do druhého. Jako další ukázku si předvedeme přípis do souboru data.backup, kam přidáme nový řádek.
open(SOUBOR, ">> data.backup") or die "Nelze otevřít soubor: $!"; Na závěr zjistíme 5 nejčastějších řádků ze souboru .bash_history nebo jiného souboru s historií příkazů. Prvním krokem bude načtení všech příkazů z tohoto souboru do hashe, kde klíčem bude vždy příkaz a hodnotou počet použití.
my $historie = $ENV{"HISTFILE"}; #cesta k souboru s historií Poznámka - zápis cesty jako $ENV{"HISTFILE"} je lepším - tedy obecnějším - řešením než natvrdo zadaná cesta /home/user/.bash_history. V systémové proměnné $HISTFILE je uložena cesta k souboru s historií. Hashová proměnná %ENV souvisí se spoluprácí s operačním systémem, kterou se teprve budeme zabývat. Podle hodnot ale nelze řadit hash. Abychom si zjednodušili práci, vytvoříme pole, do jehož každého prvku uložíme text ve formátu počet_použití_příkazu - příkaz.
foreach my $klic (keys %stat){ Pole číselně (nemusíme si všímat případného varování) seřadíme a tiskneme požadovaný počet řádků.
foreach my $klic (sort {$b <=> $a} @radky){ Ještě aktualizujeme deklarace proměnných a získáváme celý zdrojový kód. To byly nejzákladnější příkazy z oblasti práce se soubory, na které příště navážeme.
Související články
Předchozí Celou kategorii (seriál) Další
Perl (1) - Dávka teorie na úvod
Perl (2) - Úvod do syntaxe Perl (3) - Proměnné Perl (4) - Čísla a řetězce Perl (5) - Podmínky Perl (6) - Pravdivostní výrazy Perl (7) - Vstup poprvé Perl (8) - Některé základní vestavěné funkce Perl (9) - Cykly Perl (10) - Další řídící struktury Perl (11) - Pole - úvod Perl (12) - Pole - základní operace Perl (13) - Hashe Perl (14) - Další nástroje pro seznamy Perl (15) - Výchozí proměnná, heredoc, symbolické odkazy Perl (16) - Regulární výrazy - začínáme Perl (17) - Regulární výrazy - kotvy Perl (18) - Regulární výrazy - množiny znaků Perl (19) - Regulární výrazy - opakování a kvantifikátory Perl (20) - Regulární výrazy - magické závorky Perl (21) - Regulární výrazy - nahrazování Perl (22) - Regulární výrazy - přepínače Perl (23) - Regulární výrazy - rozšířené vzory Perl (24) - Regulární výrazy - příklady Perl (25) - Regulární výrazy - závěr Perl (26) - Podprogramy Perl (27) - Prototypy Perl (28) - Rozsahy platnosti proměnných Perl (30) - Práce se soubory Perl (31) - Testování souborů Perl (32) - Jiné typy souborů Perl (33) - Formátování výstupu - printf Perl (34) - Formátování výstupu - formáty Perl (35) - Vestavěný debugger Perl (36) - Grafické debuggery Perl (37) - Začínáme s moduly Perl (38) - Rozhraní modulu Perl (39) - Pragma Perl (40) - Dodatky k modulům Perl (41) - CPAN Perl (42) - Argumenty příkazového řádku Perl (43) - Přepínače Perl (44) - Dlouhé přepínače Perl (45) - Odkazy Perl (46) - Užití odkazů a anonymní data Perl (47) - Složitější datové struktury Perl (48) - Libovolně složité datové struktury Perl (49) - Tabulky symbolů a typegloby Perl (50) - Uzávěry a iterátory Perl (51) - Signály Perl (52) - Externí příkazy Perl (53) - Režim nakažení Perl (54) - Fork Perl (55) - Eval Perl (56) - Volby příkazu perl Perl (57) - Jednořádkové skripty Perl (58) - OOP - úvod Perl (59) - OOP - typické použití Perl (60) - OOP - dědičnost Perl (61) - OOP - přínos a užití dědičnosti Perl (62) - OOP - přetěžování Perl (63) - OOP - závěr Perl (64) - Projekt - čtečka sportovních výsledků Perl (65) - Projekt - získání dat Perl (66) - Projekt - výběr zápasů a podrobnosti Perl (67) - Projekt - dokončujeme modul Perl (68) - Projekt - zobrazení zápasů Perl (69) - Projekt - online přenos Perl (70) - Plain Old Documentation Perl (71) - Navazování proměnných Perl (72) - Navazování složitějších datových typů Perl (73) - DBM Perl (74) - Sockety Perl (75) - Obsluha více klientů Perl (76) - Síťová hra v kostky Perl (77) - Služby internetu Perl (78) - Databáze - úvod Perl (79) - Databáze - manipulace s daty Perl (80) - Databáze - závěrečné poznámky Perl (81) - CGI - příprava webového serveru Perl (82) - CGI - první skripty Perl (83) - CGI - získávání dat od uživatele Perl (84) - CGI - usnadnění tvorby skriptů pomocí modulu CGI Perl (85) - CGI - generování dokumentu modulem CGI Perl (86) - CGI - cookies Perl (87) - CGI - příklad aplikace Perl (88) - CGI - závěr Perl (89) - Mason - snadné psaní webů Perl (90) - Mason - speciální bloky Perl (91) - Mason - handlery Perl (92) - Mason - závěr Perl (93) - Catalyst - MVC framework pro Perl Perl (94) - Catalyst - základy pro psaní aplikace Perl (95) - Catalyst - šablony Perl (96) - Catalyst - spolupráce s databází Perl (97) - Curses - tvorba textových uživatelských rozhraní Perl (98) - Curses - pozicování a okna Perl (99) - Curses - měření rychlosti psaní Perl (100) - Curses - použití hotových widgetů Perl (101) - Curses - jednoduchý textový editor Perl (102) - Rozšiřování Perlu pomocí XS Perl (103) - Rozšiřování Perlu pomocí SWIG Perl (104) - Testování rychlosti Perl (105) - Testování programových jednotek Perl (106) - Debugování pomocí komentářů Perl (107) - Moose - moderní objektový systém Perl (108) - Moose - základní vlastnosti Perl (109) - Moose - role Perl (110) - Moose - meta API Perl (111) - Pokročilá práce se seznamy Perl (112) - Práce s PDF Perl (113) - Práce s archivy Perl (114) - Tk - úvod Perl (115) - Tk - umísťování widgetů Perl (116) - Tk - základní widgety Perl (117) - Tk - některé pokročilejší widgety Perl (118) - Tk - čas a události Perl (119) - Tk - CD man Perl (120) - Wx - základní práce s widgety Perl (121) - Wx - události Perl (122) - Gtk2 - úvod Perl (123) - Gtk2 - základní práce s obrázky Perl (124) - Gtk2 - události a čas Perl (125) - Gtk2 - vlastní widgety Perl (126) - Gtk2 - textové okno a práce s pozicemi Perl (127) - Gtk2 - hierarchické seznamy Perl (128) - Gtk2 - dialogy Perl (129) - Gtk2 - skládání widgetů Perl (130) - Gtk2 - menu a toolbary Perl (131) - Gtk2 - transparentní okna, tray ikona, výběr souborů Perl (132) - Gtk2 - drag&drop, druid Perl (133) - Gtk2 - úpravy vzhledu aplikací pomocí rc Perl (134) - Gtk2 - Glade Interface Designer Perl (135) - XML - čtení a zápis Perl (136) - XML - DOM a SAX přístupy Perl (137) - Vlákna Perl (138) - Memoizace - cachování podprogramů Perl (139) - Profilling - efektivní odhalování pomalých míst v programu Perl (140) - Profilling - píšeme si vlastní profiler / debugger Perl (141) - Formátování kódu, deparsování, perltidy Perl (142) - Způsoby konfigurování Perl (143) - Struktura datových typů, správa paměti Perl (144) - POE - událostmi řízené programování Perl (145) - POE - aplikace typu klient-server Perl (146) - Perl 6 - jazyk budoucnosti Perl (147) - Perl 6 - regulární výrazy, nové operátory Perl (148) - Perl Culture Perl (149) - Závěr Pozvánka na Český Perl Workshop Perl 5.22.0 a vše okolo Perl 5.24.0 a vše okolo Předchozí Celou kategorii (seriál) Další
|
Vyhledávání software
Vyhledávání článků
28.11.2018 23:56 /František Kučera 12.11.2018 21:28 /Redakce Linuxsoft.cz 6.11.2018 2:04 /František Kučera 4.10.2018 21:30 /Ondřej Čečák 18.9.2018 23:30 /František Kučera 9.9.2018 14:15 /Redakce Linuxsoft.cz 12.8.2018 16:58 /František Kučera 16.7.2018 1:05 /František Kučera
Poslední diskuze
31.7.2023 14:13 /
Linda Graham 30.11.2022 9:32 /
Kyle McDermott 13.12.2018 10:57 /
Jan Mareš 2.12.2018 23:56 /
František Kučera 5.10.2018 17:12 /
Jakub Kuljovsky | |||||||||||||||||||||||||||||
ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2024) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze |