LINUXSOFT.cz Přeskoč levou lištu

ARCHIV



   

> Perl (43) - Přepínače

Rozpoznávání přepínačů je jednou ze základních vlastností většiny unixových příkazů. Perl má již v základní distribuci několik modulů, jež práci s přepínači významně usnadní.

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

Lze říci, že přepínače jsou zvláštním typem argumentů, obvykle začínající znakem -, které mění chování programu. Rozdělme si zápis přepínačů na 4 druhy.

  • jednoduchý přepínač (-x)
  • zkrácené - několik přepínačů je seskupeno za 1 znakem - (-xyz)
  • s hodnotou (-m 1500)
  • dlouhé přepínače; mohou být také s hodnotami (--file=getopt.pl)

Ze všeho nejdříve si pro lepší představu napíšeme jednoduchý skript, který pouze vypíše na každý řádek 1 argument.

$\ = ">\n";
print for @ARGV;

A zavoláme ho s různorodými parametry.

$ perl argv.pl -abc -d -o vysledek.txt data1 data2 data3
-abc
-d
-o
vysledek.txt
data1
data2
data3
$

Odtud je nutné extrahovat přepínače. Nebudeme to dělat ručně, protože nejlepší cestou, jak toho docílit, jsou moduly Getopt::*. Hlavně Getopt::Std (pro jednoduché přepínače) a Getopt::Long (pro dlouhé přepínače).

Zpracování jednoznakových přepínačů

Importem modulu Getopt::Std získáváme 2 nové funkce getopts a getopt, které nám krátké přepínače hezky roztřídí.

use Getopt::Std;

Obě funkce jsou v modulu v proměnné @EXPORT, tudíž jsou importovány do aktuálního balíku.

Při jejich používání je třeba mít na paměti, že se při volání veškeré nalezené přepínače a jejich hodnoty mažou z pole @ARGV.

getopts

První jmenovaná funkce, getopts, přijímá jako parametr speciální řetězec, složený z písmen, které mohou být přepínači. Předpokládejme, že náš program přijme 3 přepínače: -x, -y a -z. V takovém případě bude zápis funkce getopts následující.

getopts("xyz");

Nyní tato funkce podle předaných písmen nastaví příslušné proměnné ve tvaru $opt_písmeno. Konkrétně, pokud tedy jsou programu předány některé z přepínačů -x, -y, nebo -z, nastaví se odpovídající proměnné $opt_x, $opt_y, $opt_z na hodnotu 1.

A nyní ještě konkrétněji, tentokrát se podívejme na skript, který rozpozná a vypíše předané argumenty.

use Getopt::Std;
getopts("xyz");

print "X: ", $opt_x, "\n";
print "Y: ", $opt_y, "\n";
print "Z: ", $opt_z, "\n";

Teď si zkusme, jak bude program reagovat na přepínače. Je důležité, aby byly zadané přepínače před ostatními argumenty, protože by potom nemusely být zpracovány.

$ ./getopt.pl -x -z
X: 1
Y:
Z: 1

Zdá se, že je vše v pořádku. Zkusme zadat jiný vstup, ve kterém budou nedefinované přepínače.

$ ./getopt.pl -yrtg
Unknown option: r
Unknown option: t
Unknown option: g
X:
Y: 1
Z:
$

Z hlášky Unknown option je patrné, že nelze použít žádné jiné přepínače než ty, které jsou v programu uvedeny. Většinou nebude v našem zájmu, aby program Unknown option vypisoval. Abychom toho docílili, je nutné ošetřit během volání funkce getopts její návratovou hodnotu.

die "Usage: program [-xyz] file\n" unless getopts("xyz");

To byly volby typu true/false. Další věcí, kterou funkce getopts poskytuje, je přijetí hodnoty jednopísmenným přepínačem. Za všechny přepínače, které budou přijímat hodnotu, umístíme ještě dvojtečku.

getopts("x:yz:");

V našem případě přijímají hodnotu přepínače -x a -z. Díky tomu se do $opt_x, resp. $opt_z nepřiřadí 1, ale přímo hodnota předaná přepínači. Pojďme opět vyzkoušet, jak bude náš program na různá volání reagovat.

$ ./getopt.pl -zy10
X:
Y:
Z: y10
$

Toto volání se na 1. pohled možná chová trochu nelogicky. Ovšem na druhý pohled lze vše uspokojivě vysvětlit. Do $opt_z je přiřazen řetězec "y10" - tedy hodnota přepínače. Ostatní argumenty nejsou definovány.

Ještě zmatenější může být nadcházející zápis. Ale opět je třeba si uvědomit, že "-y10" bude hodnotou přepínače -z a -y nebude definováno.

$ ./getopt.pl -z -y10

Zde máme další příkaz s podobným způsobem volání. Liší se v tom, že 1. argument v pořadí, -y, nepřijímá hodnotu a tedy písmeno z je bráno jako název samostatného přepínače.

$ ./getopt.pl -yz10
X:
Y: 1
Z: 10
$

A na závěr poslední případ, kdy předáváme hodnoty i těm argumentům, které je nepožadují. V tomto případě bude zdánlivá hodnota argumentu brána jako vlastní přepínač.

$ ./perl getopt.pl -y50 -x60 -z"delsi retezec"
Unknown option: 5
Unknown option: 0
X: 60
Y: 1
Z: delsi retezec
$

Mezi přepínačem a hodnotou může samozřejmě být mezera. Pokud je mezera i v hodnotě přepínače, lze ji celou uzavřít do uvozovek nebo apostrofů, jak je naznačeno v posledním volání.

Funkce pro zpracování přepínačů zároveň veškeré nalezené přepínače a jejich hodnoty mažou z pole @ARGV.

přepínače ve strict režimu

Pokud jste předchozí útržky kódu náhodou zkoušeli s pragmou strict, jistě vám neuniklo, že překladač požaduje deklaraci. K tomu můžeme použít klíčové slovo our pro deklaraci globálních proměnných.

our $opt_x;
our $opt_y;
our $opt_z;

Často však narazíme ještě na deklaraci pomocí pragmy vars.

use vars qw($opt_x $opt_y $opt_z);

getopt

getopt slouží také pro ošetřování argumentů, ale je daleko méně striktní než getopts. Jako parametr přijímá textový řetězec, který obsahuje pouze přepínače, které přijímají hodnotu. Pro každý další jednoznakový přepínač (které se pro funkci getopt vůbec neuvádějí) vytvoří getopt příslušnou proměnnou $opt_znak. Funkce nevypisuje žádné chyby.

Tento příkaz vyžaduje, aby byly pro přepínače -a, -b a -C přiřazeny hodnoty. Pro jakýkoliv jiný jednoznakový přepínač přiřadí do příslušné proměnné pravdivou hodnotu.

getopt("abC");

Jako názorný příklad otestujeme v cyklu pro každou proměnnou $opt_znak zda existuje, a pokud ano, tak vypíšeme její hodnotu.

use Getopt::Std;
getopt("abC");
for ("a" .. "z", "A" .. "Z", 1 .. 9){
    print "\$opt_$_=".${"opt_".$_}."\n" if ${"opt_".$_};
}

Teď můžeme zkoušet. Program přijímá přepínače -a, -b a -C s hodnotou a všechny ostatní bez ní.

$ perl getopt.pl -F1x -V -C100 -a101 -b102
$opt_a=101
$opt_b=102
$opt_x=1
$opt_C=100
$opt_F=1
$opt_V=1
$opt_1=1
$

Poznámka - předchozí program by šel napsat mnohem přehledněji. Funkce getopt i getopts přijímají ještě další (nepovinný) parametr, jímž je odkaz na hash. Místo do $opt_znak se pak přepínače zpracovávají do %prepinac{"znak"}. Mimochodem tak i odpadají případné problémy s deklaracemi proměnných.

use Getopt::Std;
getopt("abC", \%prepinac);
for (keys %prepinac){
    print $_."=".$prepinac{$_}."\n";
}

Stručně k modulu Getopt::Regex

Představíme si další modul pro zpracování přepínačů. Getopt::Regex umí podle přepínače nastavit danou proměnnou nebo vykonat podprogram. Zmiňujeme se o něm hlavně proto, že k tomu využívá regulárních výrazů, čímž dosahuje zajímavých výsledků.

Getopt::Regex nabízí jedinou funkci GetOptions, která je importována z pole @EXPORT_OK. Ta dělá veškerou práci.

Nejdříve je nutné stáhnout a nainstalovat příslušný modul.

$ perl -MCPAN -e'install Getopt::Regex'

Podívejme se na syntaxi příkazu GetOptions. Na první pohled sice vypadá složitě, ale je snadno a rychle pochopitelná.

use Getopt::Regex qw(GetOptions);
GetOptions(\@ARGV,[regex, odkaz, hodnota?], ...);

regex je regulární výraz, který specifikuje přepínač, odkaz je odkaz na proměnnou (bude nastavena) nebo podprogram (bude proveden) a hodnota nabývá hodnot true/false a určujeme jí, zda přepínač přijímá hodnotu.

Ukážeme si to prakticky.

use Getopt::Regex qw(GetOptions);
GetOptions(\@ARGV, ["-[f|F]", \$p, 0]);
print $p;

Co se vlastně děje: Pokud je programu předán argument vyhovující regulárnímu výrazu -[f|F] (tj. buď -f nebo -F), nastaví se proměnná $p na hodnotu 1. V případě, že bychom uvedli místo 0 pravdivou hodnotu, do $p by se přiřadil argument, následující tím za argumentem, který vyhověl.

Vyzkoušíme si ještě možnost vykonat v případě nalezení vyhovujícího argumentu danou funkci. Náš budoucí program bude přijímat volby ve tvaru -pparametr=hodnota. Odtud vždy vypíšeme řetězec parametr = hodnota podle získaných údajů.

Poznámka - Za -p nesmí být mezera, protože se interpretuje jako oddělovač argumentů.

use Getopt::Regex qw(GetOptions);
GetOptions(\@ARGV, ["-p([^=]+)=(.+)", sub {print "$1 = $2\n";}, 0]);

Poznámka - sub {...} je tzv. anonymní podprogram a vrací odkaz na podprogram.

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ů

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

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

> Poslední diskuze

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?

Více ...

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