LINUXSOFT.cz Přeskoč levou lištu
Uživatel: Heslo:  
   CZUKPL

> Perl (32) - Jiné typy souborů

V posledním díle o práci se soubory naleznete mimo jiné čtení z adresářů a ukázku rekurze.

28.4.2006 09:00 | Jiří Václavík | Články autora | přečteno 21887×

Mimo textových souborů, kterými jsme se zabývali v předchozích dílech, existují jiné. Nejdůležitější z nich jsou adresáře, na něž přichází řada právě dnes. Později se v tomto seriálu objeví i další typ souboru, kterým je socket.

Symbolické a tvrdé odkazy

Funkce link (tvrdý odkaz) a symlink (symbolický odkaz) fungují podobně jako unixovský příkaz ln. Obě funkce přijímají jako 1. argument soubor, na který se bude odkazovat a 2. argument jako název odkazu.

symlink("soubor", "odkaz") or die "Odkaz nebyl vytvořen: $!";

Relativní cestu skutečného umístění souboru po zadání odkazu vrací funkce readlink.

print readlink "odkaz";

Binární soubory

Pro práci s binárními daty je třeba použít na ovladač funkci binmode, která ho přepne na binární režim. Poté už s ovladačem můžeme normálně pracovat.

binmode OVLADAC;

Adresáře

S adresáři se stejně jako u ostatních typů souborů pracuje prostřednictvím ovladačů. Opět je nutné adresář nejdříve otevřít. K tomu slouží funkce opendir, jejíž syntaxe se podobá funkci open. Čtení z adresáře provede funkce readdir a zavření closedir. readdir vrací v seznamovém kontextu seznam souborů a ve skalárním kontextu vrátí s každým voláním jednu položku adresáře. Následující kód vypisuje obsah kořenové složky a využívá seznamový kontext.

$, = ", ";
opendir(DIR, "/");
print readdir(DIR);
closedir DIR;

Zkusíme napsat program, který vypíše všechny soubory ze zadaného adresáře a určí zda se jedná o obyčejný soubor, adresář, symbolický odkaz nebo ještě něco jiného.

my $dir;
print "Zadej adresář, jehož strukturu chceš vytisknout: ";
chomp ($dir = <STDIN>);

opendir(DIR, "$dir") or die "Nepodařilo se otevřít $dir: $!";

while (my $pol = readdir DIR){
    if (-f $dir."/".$pol){
        print "F ";
    }elsif(-d $dir."/".$pol){
        print "D ";
    }elsif(-l $dir."/".$pol){
        print "L ";
    }else{
        print "X ";
    }

    print "$pol\n" }

closedir DIR;

Nyní tento příklad ještě o něco vylepšíme. V případě, že bude soubor adresářem, vypíšeme i jeho obsah. Obsahem budou soubory, které vždy odsadíme o příslušný počet pomlček podle toho, jak hluboko jsme aktuálně v zanoření. To je mimo jiné i typická ukázka rekurze.

Napíšeme tedy podprogram, který bude vypisovat obsah adresáře a v případě, že nalezne podadresář, volá opět sám sebe. Jak jistě tušíte, problémy nastanou s otevíráním adresářů, u kterých na to nemáme právo. Protože jde pouze o demonstrační program, nebudeme tuto situaci řešit a v takovém případě program necháme ukončit.

my $dir;
print "Zadej adresář, jehož strukturu chceš vytisknout: ";
chomp($dir = <STDIN>);
tiskni_adresarovou_strukturu($dir);

sub tiskni_adresarovou_strukturu {
    my($dir, $prefix) = @_;
    my $fh;
    opendir($fh, $dir) or die "Nepodařilo se otevřít $dir: $!";

    while (my $pol = readdir $fh){
        next if $pol eq "." or $pol eq "..";
        if (-f $dir."/".$pol){
            print "${prefix}F $pol\n";
        }elsif(-d $dir."/".$pol){
            print "${prefix}D $pol\n";
            tiskni_adresarovou_strukturu($dir."/".$pol, $prefix."-");
        }elsif(-l $dir."/".$pol){
            print "${prefix}L $pol\n";
        }else{
            print " ";
        }
    }
}

Mimo readdir existují další 3 funkce, které využívají otevřený adresář.

FunkceVýznam
seekdir(ovladač, pozice)Nastavuje aktuální pozici v adresáři na pozici
rewinddir(ovladač)Nastavuje pozici na začátek
telldir(ovladač)Vrací aktuální pozici

Funkce glob

Pro výpis souborů (ať už obyčejných nebo podadresářů) z adresáře, které vyhovují danému vzoru, lze použít k tomu určenou funkci glob. Ta v seznamovém kontextu načte do pole seznam vyhovujících souborů.

@soubory = glob("*.pl"); #pole obsahuje jména souborů s příponou .pl v aktuálním adresáři

Ve skalárním kontextu vrací každé volání název dalšího vyhovujícího souboru. Následující příklad vypíše jména všech souborů v aktuálním adresáři:

while ($soubor = glob ("*")){
    print $soubor."\n";
}

Ke stejnému účelu jako funkci glob lze využít operátor <> a to následujícím způsobem.

$, = ", ";
@soubory = <*.pl>;
print @soubory;

Nicméně operátor <> se touto možností poněkud tříští a většinou se dává přednost funkci glob. Pokud vám však hodně záleží na rychlosti, použijte přednostně kombinaci opendir, readdir, closedir, která je o něco rychlejší.

Další funkce pro práci s adresáři

FunkceVýznam
mkdir(jménopráva)vytvoří adresář
rmdir(jméno)smaže adresář
chdir([jméno])změní pracovní adresář, je-li to možné. Pokud není jméno uvedeno, nastaví aktuální adresář podle $HOME

Následující program bude vypisovat obsah zadaných adresářů, dokud budou zadávány. Každou iteraci cyklu bude změněn funkcí chdir aktuální adresář.

$, = " --- ";
print "Adresář: ";
while (<STDIN>){
    if ($_ eq "\n"){exit;}
    chomp;
    print glob("*"), "\n\n" if (chdir $_);
    print "Adresář: ";
}

Příští díl se bude věnovat možnostem formátování výstupu.

Verze pro tisk

pridej.cz

 

DISKUZE

Práce se soubory a cestami 12.5.2006 13:49 Hynek (Pichi) Vychodil




Příspívat do diskuze mohou pouze registrovaní uživatelé.
> Vyhledávání software
> Vyhledávání článků

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ář

18.6.2018 0:43 /František Kučera
Červnový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 21. 6. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát na téma: F-Droid, aneb svobodný software do vašeho mobilu. Kromě toho budou k vidění i vývojové desky HiFive1 se svobodným/otevřeným čipem RISC-V.
Přidat komentář

23.5.2018 20:55 /Ondřej Čečák
Od pátku 25.5. proběhne na Fakultě informačních technologií ČVUT v Praze openSUSE Conference. Můžete se těšit na spostu zajímavých přednášek, workshopů a také na Release Party nového openSUSE leap 15.0. V na stejném místě proběhne v sobotu 26.5. i seminář o bezpečnosti CryptoFest.
Přidat komentář

20.5.2018 17:45 /Redakce Linuxsoft.cz
Ve čtvrtek 31. května 2018 připravuje webový magazín BusinessIT ve spolupráci s Best Online Média s.r.o. pátý ročník odborné konference Firemní informační systémy 2018. Akce proběhne v kongresovém centru Vavruška (palác Charitas), Karlovo náměstí 5, Praha 2 (u metra Karlovo náměstí) od 9:00 hod. dopoledne do cca 15 hod. odpoledne. Konference je zaměřena na efektivní využití firemních informačních systémů a na to, jak plně využít jejich potenciál. Podrobnější informace na webových stránkách konfrence.
Přidat komentář

   Více ...   Přidat zprávičku

> Poslední diskuze

5.10.2018 17:12 / Jakub Kuljovsky
Re: Jaký kurz a software by jste doporučili pro začínajcího kodéra?

20.9.2018 10:04 / Jan Ober
Jaký kurz a software by jste doporučili pro začínajcího kodéra?

20.9.2018 10:00 / Jan Ober
Re: Gimp

20.2.2018 18:48 / Ivan Majer
portal

20.2.2018 15:57 / Jan Havel
Jak využíváte služby cloudu v podnikání?

Více ...

ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2018) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze