![]() ![]() |
ARCHIV |
||||||||||||||||||||||||||||||
![]() ![]() ![]() ![]() ![]() ![]() |
|
mód | význam |
+< | kdekoliv v souboru lze číst i zapisovat |
+> | kdekoliv v souboru lze číst i zapisovat, ale stávající soubor je přepsán |
+>> | kdekoliv v souboru lze číst, připisovat se dá jen na konec, takže soubor není nikdy přepsán |
Konkrétně:
open(DATA, "+<soubor");
Mó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");
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.
sysopen 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.
Příznak | Význam |
O_RDONLY | pro čtení |
O_WRONLY | pro zápis |
O_RDWR | pro čtení a zápis |
O_APPEND | pro přípis |
O_EXCL | existuje-li soubor, skončí neúspěchem |
O_CREAT | pokud soubor neexistuje, bude vytvořen |
O_TRUNC | vymaže obsah |
O_NONBLOCK | pouze neblokující otevření |
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);
K 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.
Nyní 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 <DATA>;
close DATA;
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");
print scalar $_ while <DATA>;
close DATA;
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;
my $cil;
print "Zadejte zdrojový soubor: ";
chomp($zdroj = <STDIN>);
print "Zadejte cílový soubor: ";
chomp($cil = <STDIN>);
open(ZDROJ, $zdroj) or die "Nelze zapisovat do souboru: $!";
open(CIL, ">$cil") or die "Nelze otevřít soubor: $!";
print CIL <ZDROJ>;
close ZDROJ;
close CIL;
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: $!";
print SOUBOR "20060313 55000 0 0 0\n";
close 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í
my %stat;
open(PRIKAZY, $historie) or die "Nelze otevřít soubor s historií!";
while ($prikaz = <PRIKAZY>){
chomp $prikaz;
$stat{$prikaz}++;
}
close PRIKAZ;
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){
$radky[$i] = "$stat{$klic} - $klic\n";
$i++;
}
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){
print $klic;
$pocet--;
last if $pocet == 0;
}
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.
Příspívat do diskuze mohou pouze registrovaní uživatelé. |
28.11.2018 23:56 /František Kučera
Prosincový sraz spolku OpenAlt se koná ve středu 5.12.2018 od 16:00 na adrese Zikova 1903/4, Praha 6. Tentokrát navštívíme organizaci CESNET. Na programu jsou dvě přednášky: Distribuované úložiště Ceph (Michal Strnad) a Plně šifrovaný disk na moderním systému (Ondřej Caletka). Následně se přesuneme do některé z nedalekých restaurací, kde budeme pokračovat v diskusi.
Komentářů: 1
12.11.2018 21:28 /Redakce Linuxsoft.cz
22. listopadu 2018 se koná v Praze na Karlově náměstí již pátý ročník konference s tématem Datová centra pro business, která nabídne odpovědi na aktuální a často řešené otázky: Jaké jsou aktuální trendy v oblasti datových center a jak je optimálně využít pro vlastní prospěch? Jak si zajistit odpovídající služby datových center? Podle jakých kritérií vybírat dodavatele služeb? Jak volit vhodné součásti infrastruktury při budování či rozšiřování vlastního datového centra? Jak efektivně datové centrum spravovat? Jak co nejlépe eliminovat možná rizika? apod. Příznivci LinuxSoftu mohou při registraci uplatnit kód LIN350, který jim přinese zvýhodněné vstupné s 50% slevou.
Přidat komentář
6.11.2018 2:04 /František Kučera
Říjnový pražský sraz spolku OpenAlt se koná v listopadu – již tento čtvrtek – 8. 11. 2018 od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Tentokrát bez oficiální přednášky, ale zato s dobrým jídlem a pivem – volná diskuse na téma umění a technologie, IoT, CNC, svobodný software, hardware a další hračky.
Přidat komentář
4.10.2018 21:30 /Ondřej Čečák
LinuxDays 2018 již tento víkend, registrace je otevřená.
Přidat komentář
18.9.2018 23:30 /František Kučera
Zářijový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 20. 9. 2018 od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Tentokrát bez oficiální přednášky, ale zato s dobrým jídlem a pivem – volná diskuse na téma IoT, CNC, svobodný software, hardware a další hračky.
Přidat komentář
9.9.2018 14:15 /Redakce Linuxsoft.cz
20.9.2018 proběhne v pražském Kongresovém centru Vavruška konference Mobilní řešení pro business.
Návštěvníci si vyslechnou mimo jiné přednášky na témata: Nejdůležitější aktuální trendy v oblasti mobilních technologií, správa a zabezpečení mobilních zařízení ve firmách, jak mobilně přistupovat k informačnímu systému firmy, kdy se vyplatí používat odolná mobilní zařízení nebo jak zabezpečit mobilní komunikaci.
Přidat komentář
12.8.2018 16:58 /František Kučera
Srpnový pražský sraz spolku OpenAlt se koná ve čtvrtek – 16. 8. 2018 od 19:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát jsou tématem srazu databáze prezentaci svého projektu si pro nás připravil Standa Dzik. Dále bude prostor, abychom probrali nápady na využití IoT a sítě The Things Network, případně další témata.
Přidat komentář
16.7.2018 1:05 /František Kučera
Červencový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 19. 7. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát bude přednáška na téma: automatizační nástroj Ansible, kterou si připravil Martin Vicián.
Přidat komentář
31.7.2023 14:13 /
Linda Graham
iPhone Services
30.11.2022 9:32 /
Kyle McDermott
Hosting download unavailable
13.12.2018 10:57 /
Jan Mareš
Re: zavináč
2.12.2018 23:56 /
František Kučera
Sraz
5.10.2018 17:12 /
Jakub Kuljovsky
Re: Jaký kurz a software by jste doporučili pro začínajcího kodéra?