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

> Perl (44) - Dlouhé přepínače

Poslední díl týkající se získáváním a zpracováním parametrů příkazového řádku se podrobně zabývá prací s dlouhými přepínači. Zmíníme se i o tom, jak zpracovávat dlouhé a krátké přepínače najednou.

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

Celý mechanizmus dlouhých přepínačů, který dnes přiblížíme, zajišťuje modul Getopt::Long. Již jsme si představili modul Getopt::Regex, který zpracovávat dlouhé přepínače umí. Nicméně oba tyto moduly se hodí každý na něco trochu jiného a tak se výhodně doplňují.

Dlouhé přepínače budeme rozlišovat do kategorií zejména podle typu argumentu.

  • bez hodnoty (například --encode)
  • se skalární hodnotou (--file=data.txt)
  • s více skalárními hodnotami (--file=2006.txt --file=2007.txt )

Modul Getopt::Long má tu vlastnost, že dokáže zpracovat i volby, které jsou uvedeny za jinými argumenty (jména souborů...). To znamená, že budou všechny volby nalezeny i v případech jako je tento.

$ ./program --verbose soubor1 soubor2 --extract

Avšak existuje znaménko dvojité pomlčky. Pomocí ní lze dát modulu Getopt::Long na vědomí, že dále už nemá prohledávat. V dalším volání programu ./program, který používá Getopt::Long, se zpracuje už jen volba --verbose.

$ ./program --verbose -- soubor1 soubor2 --extract

Getopt::Long podporuje i zápis přepínače s jednou pomlčkou. Při volání tak lze psát --verbose i -verbose.

Další vlastností modulu je, že funkce GetOptions implicitně nerozlišuje velikost písmen. Program lze volat s volbou --extract a účinek je stejný jako kdybychom předávali --ExtrACT. Implicitní chování je možné změnit uvedeným způsobem.

Getopt::Long::Configure("no_ignore_case");

Getopt::Long poskytuje již zmíněnou funkci GetOptions, jejíž syntaxe vypadá obecně takto. Do proměnných uvedených jako hodnoty prvků se ukládají data získaná na základě příslušných přepínačů.

GetOptions("prepinac1" => \$promenna1, "prepinac2" => \$promenna2, ...);

Dlouhé přepínače bez hodnoty

Nejjednodušším případem dlouhých přepínačů je přepínač bez hodnoty. Napíšeme kód, který bude přijímat volby --get a --verbose.

use Getopt::Long;

GetOptions(
    "verbose" => \$verbose,
    "get" => \$get
);

print "verbose = $verbose\n";
print "get = $get\n";

Do proměnných předaných funkci GetOptions se bude ukládat pravdivá nebo nepravdivá hodnota podle toho, zda byl ten který přepínač zadán.

$ ./getopt.pl --verbose
verbose = 1
get =
$

Inkrementační volby

Inkrementační volby jsou cestou, jak rozlišit, kolikkrát byla zadána tatáž volba.

Přidáním znaménka + (ve zdrojovém kódu podtrženo) na konec jména přepínače docílíme toho, že se hodnota v dané proměnné nenastaví na pravdivou hodnotu, ale inkrementuje se. A inkrementuje se tolikrát, kolikrát byla zadána.

use Getopt::Long;
$verbose = 0;
GetOptions("verbose+" => \$verbose);
print "Ukecanost = $verbose\n";

Zadáme-li tomuto skriptu volbu --verbose, funkce GetOptions přenastaví hodnotu proměnné $verbose na 1. Pokud zadáme --verbose --verbose, $verbose se zvětší na hodnotu 2, apod.

Negované volby

Představme si, že chceme nabídnout 2 volby pro 1 proměnnou - jednu pro výslovné true a druhou pro výslovné false. Tedy například --list a --no-list (resp. --nolist). Je zbytečné uvádět v GetOptions 2 volby, protože stačí jedna. Jestliže za volbu připíšeme vykřičník (opět podtržen), automaticky vzniká další volba s předponou no- (resp. no).

use Getopt::Long;
GetOptions("list!" => \$list);
print "list = $list\n";

Uvedením --list se proměnná $list nastaví na 1, naopak --no-list nastavuje 0. Obsahy příslušných proměnných jsou zřejmé z výstupu programu.

$ ./getopt.pl
list =
$ ./getopt.pl --list
list = 1
$ ./getopt.pl --nolist
list = 0
$

Dlouhé přepínače se skalární hodnotou

Pro to, aby byly zpracovávány i hodnoty voleb, je nutné za volbu v příkazu GetOptions uvést znak = (má-li být hodnota volby povinná) nebo : (má-li být nepovinná) a za ním datový typ. Ten nabývá těchto hodnot.

HodnotaVýznam
sřetězec
fdesetinné číslo
iklasické celé číslo
ocelé číslo; je zde navíc podpora dvojkové (0b), osmičkové (0), šestnáctkové (0x) soustavy a znamének

Uveďme si krátký kód, vyžadující celočíselnou hodnotu přepínače, pokud je tento přepínač uveden.

use Getopt::Long;
GetOptions("size=i" => \$size);
print "size = $size\n";

Jestliže volbu nezadáme, nebude program protestovat. Varování ale vypíše tehdy, pokud zadáme volbu bez hodnoty.

$ ./getopt.pl --size=11
size = 11
$ ./getopt.pl --size
Option size requires an argument
size =
$ ./getopt.pl
size =
$

Je-li použit znak :, lze za něj napsat i hodnotu, která bude dané proměnné přiřazena v případě, že bude na příkazovém řádku zadán poze přepínač bez hodnoty. Přepínači --size nastavíme jako implicitní hodnotu 12.

use Getopt::Long;
GetOptions("size:12" => \$size);
print "size = $size\n";

Dlouhé přepínače s více hodnotami

Pokud v GetOptions zaměníme odkaz na skalár za odkaz na pole, bude vloženo tolik hodnot, kolik jich bylo zadáno.

use Getopt::Long;
GetOptions("file=s" => \@file);
print "file = @file\n";

Při zadávání více hodnot je nutné volbu opakovat tolikrát, kolik hodnot bude.

$ ./getopt.pl --file=create.sql --file=insert.sql
file = create.sql insert.sql
$

Funkci GetOptions lze předat dokonce i hash. Poté vyžaduje páry hodnot.

use Getopt::Long;
GetOptions("www=s" => \%www);
print "www = ";
print $_."=".$www{"$_"}." " for keys %www;
print "\n";

V takovém případě se volá program tímto způsobem.

$ ./getopt.pl -www www.linuxsoft.cz="Linux Software" --www www.google.com=Google
www = www.google.com=Google www.linuxsoft.cz=Linux Software
$

Další možnosti funkce GetOptions

Ukládání voleb do hashe

Podobně jako u jednoznakových přepínačů lze určit hash, do kterého se mají volby souhrnně ukládat. Formát takového hashe je pak $hash{"volba"} = hodnota.

Potom se ale poněkud mění fungování funkce GetOptions. Jako první parametr je nutno zadat odkaz na hash a dalšími parametry jsou jednotlivé volby.

use Getopt::Long;
GetOptions("\%volby, "height=f", "width=f", "length=f");
print $_."=".$volby{$_}."\n" for keys %volby;

Aliasy

GetOptions umožňuje výskyt synonymních voleb. To znamená, že lze nastavit 1 proměnnou pro více voleb. Takové volby pak mají totožný význam.

K tomu je třeba vepsat do GetOptions obě možnosti a oddělit je znakem |.

use Getopt::Long;
GetOptions("paste|insert|ins=s" => \$insert);
print "insert = $insert\n";

Nyní bude proměnná $insert nastavena ve všech těchto případech volání.

$ ./getopt.pl --insert=zvuk.ogg
$ ./getopt.pl --paste=zvuk.ogg
$ ./getopt.pl --ins=zvuk.ogg

Volání podprogramů

Stejně jako odkaz na proměnnou je možné předávat odkaz na podprogram. V takovém případě se žádná proměnná nenastavuje, ale zato se v případě uvedení přepínače provede daný podprogram.

use Getopt::Long;
GetOptions("pozdrav" => sub {print "Ahoj!\n";});

Kombinace krátkých a dlouhých přepínačů

Getopt::Long umožňuje zpracovávání dlouhých i krátkých přepínačů najednou. A to dokonce tak, aby bylo možné krátké volby seskupovat.

Slouží k tomu funkce Configure, která se stará o nastaveví chování modulu. Pokud jí jako parametr předáme hodnotu bundling (svazkování), bude brát přepínače s jednou pomlčkou vždy jako jednoznakové a se 2 pomlčkami jako dlouhé.

use Getopt::Long qw(Configure GetOptions);
Configure("handling");
GetOptions("decode" => \$decode, "x" => \$x, "y" => \$y, "z" => \$z);

print "x: $x\n";
print "y: $y\n";
print "z: $z\n";
print "decode: $decode\n";

Nyní se budou zadáním voleb -xyz --decode hledat přepínače -x, -y, -z a --decode. Pokud bude ale zadáno -xyz -decode budou považovány všechny všechny volby za jednoznakové: -x, -y, -z, -d, -e, -c, -o, -d a -e. To ve většině případů nemáme v úmyslu. Proto existuje pro funkci Configure ještě hodnota handling_override, která umí taková zadání rozpoznat. Potom bude fungovat i zápis -xyz -decode podle očekávání.

Jako základ o Getopt::Long by měl tento díl seriálu stačit. Pokud vás však informace v něm stále neuspokojily, pak můžete nahlédnout do dokumentace.

Verze pro tisk

pridej.cz

 

DISKUZE

handling vs bundling 16.3.2010 20:39 Martin 'Márty' Šimko




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

5.2.2016 17:38 /Petr Ježek
Utilitka z XFce "xfce4-power-manager" nejen umožňuje nastavení lhůty pro uspání či hybernaci, ale i zapínání a vypínání prezentačního módu pro nerušené sledování videí. Stačí ji nastavit v každém vybavenějším panelu a v jakémkoli nontiled WM/DE.
Přidat komentář

10.1.2016 11:32 /Pavel `Goldenfish' Kysilka
LinuxMarket změnil provozovatele. Nově jej provozuje Marek Pszczolka. Více info a detaily #1 a #2.
Přidat komentář

29.12.2015 11:38 /Ondřej Čečák
Ještě posledních pár dní můžete přidávat příspěvky nebo nápady na Install Fest 2016, který se bude konat 5. a 6. března 2016.
Přidat komentář

8.12.2015 11:36 /Petr Ježek
Logické se stává realitou. LibreOffice a Thunderbird se mají dle článku na Redditu stát protiváhou MS řešení (MS Office a Outlook).
Přidat komentář

17.11.2015 3:31 /Miloslav Ponkrác
Unicode se připravuje na verzi 9.0. Čerství kandidáti na nové znaky jsou zde.
Přidat komentář

3.11.2015 12:59 /Petr Ježek
Desktopových prostředí podporujících Wayland je jako šafránu. Blížící se Enlightenemt E20, nyní ve stažitelné beta verzi tak může udělat díru do světa X a posunout jej k Waylandu. Nutné jsou ale nové knihovny EFL 16 (pro X stačí nadále EFL15).
Komentářů: 1

7.10.2015 15:43 /Redakce Linuxsoft.cz
PR: 20.10 2015 proběhne v pražském Kongresovém centru Vavruška na Karlově náměstí již druhý ročník odborné konference na téma Datová centra pro business. Mezi hlavní témata bude patřit úspornost, pružnost nebo automatizovaná správa datových center.
Přidat komentář

4.10.2015 23:10 /František Kučera
Příběh o tom, jak probíhá hledání a opravování chyby v autorovi dosud neznámém kódu, vypráví článek Opravujeme chyby v softwaru: inotify-tools. Krok za krokem stáhneme zdrojové kódy, přeložíme program a najdeme chybu – seznámíme se se základními postupy a nástroji pro diagnostiku chyb (verzovací systém, IDE, GNU Debugger, Kompare).
Přidat komentář

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

> Poslední diskuze

7.2.2016 19:41 / Dušan Trnka
změna velikosti disk.oddílu

2.1.2016 15:54 / Josef Němec
Re: adobe flash

27.11.2015 14:40 / Linda Gremillion
jujitsu gi

6.11.2015 13:30 / sss lokesh
websphere online Training

3.11.2015 13:01 / Petr Ježek
Chybka

Více ...

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