![]() |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() ![]() ![]() |
|
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.
|
||
DISCUSSION
For this item is no comments. |
||
Add comment is possible for logged registered users.
|
1. |
Pacman linux Download: 5004x |
2. |
FreeBSD Download: 9214x |
3. |
PCLinuxOS-2010 Download: 8700x |
4. |
alcolix Download: 11096x |
5. |
Onebase Linux Download: 9809x |
6. |
Novell Linux Desktop Download: 0x |
7. |
KateOS Download: 6372x |
1. |
xinetd Download: 2535x |
2. |
RDGS Download: 937x |
3. |
spkg Download: 5040x |
4. |
LinPacker Download: 10209x |
5. |
VFU File Manager Download: 3311x |
6. |
LeftHand Mała Księgowość Download: 7340x |
7. |
MISU pyFotoResize Download: 2973x |
8. |
Lefthand CRM Download: 3673x |
9. |
MetadataExtractor Download: 0x |
10. |
RCP100 Download: 3270x |
11. |
Predaj softveru Download: 0x |
12. |
MSH Free Autoresponder Download: 0x |