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

> Perl (56) - Volby příkazu perl

Jaké máme možnosti při spouštění perlových programů ze shellu? Budeme se zabývat přepínači příkazu perl.

25.4.2007 06:00 | Jiří Václavík | Články autora | přečteno 11681×

Přepínačů, které ovlivňují chování má perl celou řadu. My si je představíme, protože některé z nich budeme ještě v budoucnu potřebovat. Jiné uveďme pouze pro zajímavost jako ilustraci možností.

Charakteristika

perl [volby] zdrojový_soubor [parametr1] [parametr2] ... [parametrn]

Již známé přepínače

Přepínače v následující tabulce jsme již používali a nebudeme je nyní více rozebírat.

PřepínačPopis
-dspustí program v debuggeru
-vzobrazí informace o verzi, licenci atd.
-Mnačte modul
-Iadresář, ve kterém se budou přednostně hledat moduly
-t, -Taktivuje režim nakažení

Varování a chyby

Zapnutí zobrazování varování

Přepínač -w zapíná varování. Upozorňuje na úseky programu, které sice překladač vezme, ale je zde podezření na chybu. Často tedy najde chybu, aniž bychom ji museli hledat my.

Uveďme jednoduchý příklad - program na jediný řádek. Sledujme, jak zapůsobí přepínač -w.

print $i;

Porovnejme výstup s volbou -w a bez ní.

$ perl volby.pl
$ perl -w volby.pl
Name "main::i" used only once: possible typo at volby.pl line 1.
Use of uninitialized value in print at volby.pl line 1.
$

Obdrželi jsme hned dvě varování. První z nich říká, že je proměnná v programu použita jen na jediném místě. To je opravdu vždycky podezřelé (tedy pokud to není speciální proměnná - ovšem ty přepínač -w nehlásí). Druhým varováním dává Perl najevo, že se mu nelíbí náš způsob práce s proměnnou $i. Nic v ní není a už ji tiskneme. V obou případech má Perl více méně pravdu a stálo by za to něco s tím udělat. Oba problémy se vyřeší tak, že se před print přiřadí do $i prázdný řetězec.

Většinou je lepší používat místo -w pragmu warnings, jejíž význam je podobný.

Další přepínač, -W, zapíná všechna možná varování.

Vypínání varování

-X veškerá varování ruší. Funkce die funguje normálně.

Jednořádkové skripty

Podobně jako u jiných skriptovacích jazyků není vždy nutné psát přímo skripty. Je většinou zbytečné ukládat do souboru jen krátký a jednorázový příkaz. Použijeme-li přepínač -e a za něj do uvozovek příkaz, vykoná se stejně, jako šlo o skript. Tímto způsobem lze předávat i delší posloupnosti příkazů, ač to není příliš přehledné.

Pokud potřebujeme rychle přímo ze shellu ASCII hodnotu písmena d, stačí zadat:

$ perl -e 'print ord "d"'
100$

Uvedeme-li lichý počet uvozovek, apostrofů nebo obrácených apostrofů, příkaz se neprovede. Po odentrování se dostaneme na nový řádek, uvozený sekundárním promptem, a můžeme pokračovat v příkazu.

Problém nastane, když budeme chtít vytisknout apostrof. Samotné zpětné lomítko nestačí. K vypsání apostrofu použijeme takovouto změť znaků.

$ perl -e 'print "'\''"; '
 ' $

Přepínačem -e se ještě budeme zabývat. Mimo jednorázových příkazů se také často používá v kombinaci s nástroji shellu, cronem apod.

Přepínače pro ladění

Následovat budou přepínače, které jednorázově přidávají do našeho kódu nějaký další. Moc lidí je nepoužívá, ale představme si je, možná se někomu některý zalíbí.

Volba -n

Tato volba má ten efekt, že se náš program obalí cyklem while (<>){ ... náš program ... }. Podívejme se na tento program.

$i++;
print "$i: $_";
$_++;

Spustíme-li ho s volbou -n, bude se tvářit (při aktuálním spuštění) takto.

while (<>){
    $i++;
    print "$i: $_";
    $_++;
}

Zkusme ho tedy spustit.

$ perl -n volby.pl
666
1: 666
6*4
2: 6*4
...

Originální program se provádí stále dokola, pokaždé s jiným testovacím vstupem.

Volba -p

Zde se oproti -n $_ tiskne v bloku continue, který volba -p přidává. Struktura simulovaného programu vypadá následovně: while (<>){ ... váš program ... } continue { print; }.

Zkusme spustit předchozí příklad znovu, jen zvolíme volbu -p. Výstup je trochu nepřehledný ale vstup rozeznáte podle kurzívy:

$ perl -np volby.pl
666
1: 666
6676*4
2: 6*4
7
...

Je to téměř to samé, co minulý příklad. Liší se jen v tom, že volba -p zajistí vytisknutí hodnoty proměnné $_ po skončení programu (jako by program končil příkazem print $_;). Řádek $_++; neměl v předminulém příkladě žádný efekt na výsledek, nyní již ano.

Volba -pe

Další možností užití -p je v kombinaci s -e. Každý řádek vstupu (soubor v parametru nebo klasicky stdin - podrobnosti za chvíli) je načten a jsou s ním provedeny příkazy, uvedené jako parametr volby -e. Poté se tiskne.

Struktura: while (<>) { ... příkazy v hodnotě volby -e ... } continue { print; }

Praktická ukázka: Chceme očíslovat řádky v dnes několikkrát zmiňovaném souboru volby.pl a vytisknout.

$ perl -pe '$i++;print $i.". ";' volby.pl
1. $i++;
2. print "$i: $_";
3. $_++;
$

Je to poměrně rychlé řešení. Chceme-li navíc uložit výsledek do souboru ukazka, použijeme nástroje shellu.

$ perl -pe '$i++;print $i.". ";' volby.pl > ukazka
$ more ukazka
1. $i++;
2. print "$i: $_";
3. $_++;
$

Volby -na, -F

S volbou -na bude mít program následující strukturu:

while (<>){
    @F = split (\ \);
    ... samotný program ...
}

Opět vytvoříme ukázkový program. Bude vypadat takto.

$, = "*";
$\ = "\n";
print @F;

A zkusíme spustit.

$ perl -na volby.pl
každá mezera je nahrazena hvězdičkou
každá*mezera*je*nahrazena*hvezdičkou
...

Pokud chceme za while přidat ještě continue { print; }, můžeme příkaz rozšířit o přepínač -p.

Nechceme-li nahrazovat mezeru, ale jiný řetězec vyhovující vzoru (zvolil jsem znaky Q a r), přidejme volbu -F (a za ní v apostrofech a lomítkách regulární výraz).

$ perl -na -F'/[Qr]/' program.pl
QwertyQwerty
*we*ty*we*ty
...

Nahrazování v souboru pomocí regulárních výrazů

Pokud se některé kombinace přepínačů používají opravdu často, pak mezi ně patří -pi -e. Pomocí nich můžeme nahradit části souboru vyhovující regulárnímu výrazu jiným textem. Samotné -i zajišťuje, že se výsledek nahrazuje stávající soubor. Bez -i by se vytiskl na výstup. Máme soubor os s tímto obsahem.

Windows Vista

Aplikujeme na něj tento příkaz.

$ perl -pi -e's/Windows Vista/SUSE Linux/g;' os

Hned je obsah os o něco hezčí.

SUSE Linux

Pokud chceme zároveň starý soubor zálohovat, použijme hodnotu pro přepínač -i. Ta udá příponu zálohy.

$ perl -p -i.backup -e's/Windows Vista/SUSE Linux/g;' os

Možnosti této konstrukce ještě zvyšuje možnost určení souborů podle žolíkových znaků.

Separátor při čtení ze zdroje dat

Volba -0 mění separátor $\, který například určuje, kam až se bude číst ze zdroje dat <>. Implicitně je oddělovačem znak nového řádku. Zkusme použít nějaký další separátor - uvádí se jako hodnota přepínači -0. Pozor na to, že musíme uvést oktálovou hodnotu. (ASCII tabulka)

Máme textový soubor data, kde jsou jednotlivá slova oddělena hvězdičkami.

text*oddělený*hvězdičkami*

A dále zdrojový kód programu.

@p = <>;

foreach (@p) {
    print "$_\n";
}

Spusťme program. Jako parametry uveďme přepínač -0052 a soubor data. Hodnota 052 je oktálové vyjádření hvězdičky v ASCII tabulce. Sledujme, co se stane.

text*
oddělený*
hvězdičkami*

Něco navíc

Přepínač -x

Pouze pro zajímavost zmiňme, že ve skutečnosti nemusí být řádek #!/usr/bin/perl na prvním řádku. Použijeme-li volbu -x, pak vše, co je před tímto řádkem je ignorováno. Použijeme-li -x, musí tam už #!/usr/bin/perl povinně být (a to na začátku řádku). V opačném případě budeme svědky hlášky No Perl script found in input.

Kontrola syntaxe

S volbou -c Perl zkontroluje syntaxi, aniž by se program spouštel.

Program se nedostane do fáze běhu. Proto bude provedeno pouze to, co je v blocích BEGIN a CHECK.

BEGIN {
    print "Jsem v BEGIN\n";
    $i = 1;
}

$i = 10;
print "za BEGIN";

Kód za BEGIN se už nevykonává, ale jen kontroluje.

$ perl -c volby.pl
Jsem v BEGIN
volby.pl syntax OK
$

Přepínače a řádek #!${PATH}/perl

Na některých unixových systémech můžete údajně za #! napsat maximálně jen 32 znaků. Já jsem se s tímto problémem zatím nesetkal.

Do tohoto řádku lze uvést i volby. Takže chceme-li mít zapnutý režim nakažení, bude náš první řádek vypadat nějak takto.

#!/usr/bin/perl -T

perlcc

Jak víme už od úvodního dílu, příkaz perlcc vytváří ze zdrojových kódů binární kód. Následující příkaz vytvoří spustitelný soubor a.out.

perlcc program.pl

Pomocí přepínače -o ho lze pojmenovat jinak.

perlcc -o program program.pl

S přepínačem -e lze kompilovat i jednořádkové skripty.

perlcc -e 'print "Hello world\n"' -o program

Verze pro tisk

pridej.cz

 

DISKUZE

Nejsou žádné diskuzní příspěvky u dané položky.



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

24.1.2015 18:33 /Petr Ježek
Právě byla vydána další verze Waylandu a jeho referenčního kompozitoru Weston, obé nyní 1.6.1. Tak vzhůru do testování!
Přidat komentář

23.1.2015 7:16 /MaReK Olšavský
Jak se zlepšují možnosti síťových karet, tak je potřebné reagovat i na straně úprav ovladačů, aby se jejich potenciál dal využít. 100 Gbs síť se asi nedostane do SOHO segmentu v dohledném časovém horizontu, ale pro datová centra velkých firem bude přínosnou možností.
Přidat komentář

23.1.2015 7:16 /MaReK Olšavský
Nová velká šance pro linuxové programátory se otevírá v Brně, jelikož Red Hat chce nabrat další vývojáře, kteří budou pracovat na Waylandu, X.org, OpenGL, či ovladačích GPU. Pochopitelně jsou potřebné zkušennosti s programováním a optimalizací. RH zbrojí a Canonical nebude mít jednoduchou situaci, aby prosadil svůj Mir.
Přidat komentář

22.1.2015 7:17 /MaReK Olšavský
Standard PC/104 (SBC) byl aktualizován o sběrnici „OneBay“ s USB, PCIe linkami a malými rozměry.
Přidat komentář

22.1.2015 7:17 /MaReK Olšavský
MicroSoft docela zajímavě mění strategii, stávající uživatelé MS Windows by měli mít možnost bezplatného přechodu na blížící se Windows 10, pokud používají jednu z posledních verzí Windows. Ti kdož mají Visty a starší, protože počítač s jejich OEM verzí ještě stále funguje, se tato možnost netýká.
Komentářů: 1

22.1.2015 7:17 /MaReK Olšavský
OT: DIY chytré hodinky si může šikovný „bastlíř“ udělat i sám, jak ukazuje příspěvek na blogu Atmelu.
Přidat komentář

21.1.2015 7:20 /MaReK Olšavský
Nasazení Tizenu ve výrobcích Samsungu začíná a nezůstane jen u chytrého telefonu, jak ukazují „uniklé“ fotografie. Kéžby dlouhodobé investice Samsungu do mobilního Linuxu, s možností běhu aplikací pro Android, přinesly konkurenta, který posune vývoj mobilních OS.
Přidat komentář

21.1.2015 7:20 /MaReK Olšavský
Z dění kolem Bodhi Linuxu; forku Ubuntu LTS s desktopem Enlightenment; jde běžnému divákovi hlava kolem :-). Vedle relativně málo významného ohlášení Bodhi 3.0.0 RC2 (ano, brzy vyjde další verze) se vrací zakladatel Jeff Hoogland, který projekt opustil před několika měsíci.
Přidat komentář

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

> Poslední diskuze

24.1.2015 10:40 / Sinuhed
Re: Mazání adřářů v linuxu pro IP kamery

23.1.2015 14:57 / Ladislav Kulatý
Re: FFMpeg složené zařízení

23.1.2015 14:55 / Ladislav Kulatý
Mazání adřářů v linuxu pro IP kamery

23.1.2015 10:58 / Sinuhed
Re: Sanba

23.1.2015 7:04 / MaReK Olšavský
Doplnění

Více ...

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