140 likes | 253 Views
Balíky. Hlavní balík - main - zatím jsme s jiným nepracovali Rozdělují tzv. namespaces = množiny jmen pro proměnné Vlastní jméno se píše za dvojici dvojteček :: $lemma = "cukr"; znamená (znamenalo dosud) $main::lemma = "cukr"; $Potraviny::lemma = "cukr"; # jiná proměnná
E N D
Balíky • Hlavní balík - main - zatím jsme s jiným nepracovali • Rozdělují tzv. namespaces = množiny jmen pro proměnné • Vlastní jméno se píše za dvojici dvojteček :: • $lemma = "cukr"; znamená (znamenalo dosud) • $main::lemma = "cukr"; • $Potraviny::lemma = "cukr"; # jiná proměnná • použijeme-li v programu use strict => nutné používat globální proměnné celým jménem
Package • Celá jména se nemusí používat, když nastavíme balík: • Příkaz package - nastavení implicitního balíku • Platí • do konce bloku, ve kterém byl zaveden, • dokud se nezavede nový implicitní package $lemma = “mouka"; # týká se proměnné $main::lemma package Potraviny; $lemma = "cukr"; # týká se proměnné $Potraviny::lemma
Moduly • balíčky pro vícenásobné použití • rozdělení podle tématu - logicky • proměnné • datové struktury • podprogramy • šetří čas • spousta předpřipravených (není třeba programovat něco, co už někdo udělal): • CPAN - Comprehensive Perl Archive Network
Použití modulu • uložení v jednom souboru, který se vkládá do programu • jméno souboru = jméno modulu s příponou .pm • zvyk - 1. písmeno velké • vložení modulu do programu pomocí příkazu • do • require • use • použití před začátkem programu, ať se zapíše kdekoli Nepoužívají se často use Modul;
Příkladmodulu # priklad jednoduchého modulu Ahoj.pm $pozdrav = “Ahoj“; 1; #!/usr/bin/perl # využití modulu use Ahoj;# modul se načte do programu print “$pozdrav, Pepo!\n“;
Jak vypadá modul • nastavení balíku stejného jména jako modul (package) • definice rozhraní pomocí modulu Exporter • které prvky jsou určeny k použití v programech • implementace uvnitř modulu se může změnit, ale rozhraní by mělo zůstat stejné • např. algoritmus nějakého výpočtu, • konkrétní implementace struktur, ... • vlastní tělo modulu • zakončení modulu – příkazem 1; • označuje úspěšné zakončení vložení
Vytvoření modulu • Modul může obsahovat podprogramy (k tomu hlavně moduly jsou) • veřejné - nabízejí se k použití uživateli • soukromé - skryté před uživatelem, vlastně pomocné package Orwell;# nastaveni baliku use Exporter; # definice rozhrani @ISA = qw(Exporter); @EXPORT = qw(&radka &vypis); # k dispozici sub radka {...} sub vypis {...} sub vypocet {...}
Vytvoření modulu a jeho použití package Orwell;# nastaveni baliku use Exporter; # definice rozhrani @ISA = qw(Exporter); @EXPORT = qw(&radka &vypis); # k dispozici sub radka {...} sub vypis {...} sub vypocet {...} use Orwell; my $line = radka(); # totéž jako Orwell::radka() ... vypis();
Hledání modulu - pole @INC • Seznam cest, kde Perl hledá moduly a ostatní soubory • Cestu nelze přidat jednoduše push (@INC, ~/MojeModuly); use Orwell; • protože 1. příkaz se provádí při běhu, druhý už při kompilaci • Příkaz use lib • Tedy např. takto: use lib "~/MojeModuly"; use Orwell;
Moduly podle témat • Pomocí dvojité dvojtečky :: • Rozdělení do adresářů • Adresář MojeModuly, v něm • podadresář Lingv, v něm • soubor Orwell.pm obsahující modul Orwell. use lib "~/MojeModuly"; use Lingv::Orwell;
Pragma • speciální druh modulu • ve standardní distribuci Perlu • nepřidává nové konstrukce, ale ovlivňuje chování programu • Některé už známe: • use locale • use strict • use lib • Další užitečné: • use constant • use integer use constant PI => 3.1415; $obvod = PI * 2 * $r;
CPAN http://search.cpan.org/ • rozdělené tematicky • vyhledávání • instalace - jen root • dokumentace - popis použití
Příklady modulů z CPAN • Env • zpřístupňuje proměnné prostředí - globální proměnné se stejným názvem, např. $HOME, $PATH. • Term::ReadKey • funkce ReadKey umožňuje číst ze standardního vstupu jednotlivý znak, není třeba použít Enter. • Getopt::Std • funkce getopts rozeznává volby od parametrů (viz příklad na následující stránce)
#!/usr/bin/perl # pouzitimodulugetoptnapriklad z minula use Getopt::Std; our($opt_n,$opt_i,$opt_o); getopts("ni:o:"); #my $num = 0; my $input = $opt_i; my $output = $opt_o; #if(defined ($input) and $input eq "-n") {$num=1; $input = shift;} #my $output = shift; if(defined($input)){ open(INPUT,$input) ordie "Nemuzuotevrit soubor $input: $!\n?";} else {*INPUT = *STDIN;} if(defined($output)){ open(OUTPUT,">$output") ordie "Nemuzuotevrit soubor $output:} $!\n";} else {*OUTPUT = *STDOUT;} my @file = <INPUT>; #if($num) {@file = sort {$a <=> $b} @file;} if($opt_n) {@file = sort {$a <=> $b} @file;} else{@file = sort @file;} print OUTPUT @file;