ČVUT FIT: BI-SKJ: Perl J. Škvor, březen - duben 2011
Příprava studijního programu Informatika je podporována projektem financovaným z Evropského sociálního fondu a rozpočtu hlavního 1 města Prahy. Praha & EU: Investujeme do vaší budoucnosti
Perl: úvod • • • • • • •
Practical Extraction and Report Language 1986 Larry Wall Perl 5.10, různé platformy původně: zpracování textu dnes: administrace, web, databáze, … http://www.perl.org Perl 6: vývoj ČVUT FIT, BI-SKJ Perl, J. Škvor, březen 2011
2
Perl: přehled • • • • •
regulární výrazy asociativní pole podobnost s C, … efektivita kódu CPAN
• • • •
benevolence proměnlivá syntaxe bez datových typů kontextová závislost, přizpůsobení • implicitní proměnné
ČVUT FIT, BI-SKJ Perl, J. Škvor, březen 2011
3
Perl: základy • • • • • • •
textový soubor, *.pl, spustitelný perl –e ´příkaz´ #!/usr/bin/perl # komentáře za příkazy;; deklarace = 1. použití bloky { } ČVUT FIT, BI-SKJ Perl, J. Škvor, březen 2011
4
Perl: proměnné • • • • • • •
$skalár (číslo, řetězec, odkaz) @pole (heterogenní) %hash (asociativní pole) &funkce *alias SOUBOR $a, @a, %a – jsou různé proměnné ČVUT FIT, BI-SKJ Perl, J. Škvor, březen 2011
5
Perl: příkládky • print "hello, hello, world! world!\n"; • $prep= prep=sqrt($odv1**2+$odv2**2); sqrt($odv1**2+$odv2**2); • while( while(($je = ($cis ($cis % $delitel $delitel)) delitel)) && $delitel++ delitel++ <= sqrt($cis)) sqrt($cis)){}; ($cis)){}; • while (<>) { for (split//) split//) {$x{ {$x{$_} $_}++}}
ČVUT FIT, BI-SKJ Perl, J. Škvor, březen 2011
6
Perl: obfuscated 3-001-%u-031-%f(:s)3-1-%u-34-%f( :gns)%{<1:%{=%u:%{*<71(zs)%{-01%{*51-54-%f-%f(:|s)3-1-%u-04-cm` bj(:%b,?%bs)3-1-%u-311 (:%G<,041 :v)1-%L-31-C-%x(:v)%G-%L-,021-C%x(:%B<,91:v),31-041-,4-B-%c(:v) ,91-041-,74-B-%c(:%E<,%I:v)1-02 1-31-E-%x(:v),%I-021-, 91-E-x(:% ČVUT FIT, BI-SKJ Perl, J. Škvor, březen 2011
7
Perl: skaláry • čísla obvykle; 0x11, 0b11, 1_000_000 • řetězce "ahoj $jm" ' ahoj $jm', `date` qq/ahoj $jm/ q(ahoj) qx!date! • escape \n \t … \L \U \l \u \E • auto konverze číslo - řetězec • here document << print <
$dopis = <
ČVUT FIT, BI-SKJ Perl, J. Škvor, březen 2011
8
Perl: operátory • číselné ** % += -= **= %= & | ^ << >> $x++; ++$x; $x---$x; $x; $x--; --; -$kc -= $kc $kc % 100; $x += $x + ($x << 3);
• logické hodnoty, false: 0 "" "0" undef ostatní = true • relační operátory: číselné X řetězcové (!) 'jablko' jablko' == 'hruska 'hruska‘ hruska‘
<=> cmp ČVUT FIT, BI-SKJ Perl, J. Škvor, březen 2011
9
Perl: operátory • logické && || ! ^ and or not xor zkrácené vyhodnocení • řetězcové . x .= x= • ternární operátor $a > 0 ? print "kladne "kladne" kladne" : print "zaporne" zaporne"
• priorita, asociativita while ($a != $b) { $a > $b ? ($a($a-=$b):($b =$b):($bb):($b-=$a); } ČVUT FIT, BI-SKJ Perl, J. Škvor, březen 2011
10
Perl: std. funkce • číselné: sqrt, sin, abs, … • řetězcové index(řetěz, podřetěz [, offset]), rindex substr(řetěz, start [, délka]); substr($prom, 5, 2) = 'ahoj'; length, reverse, lc, uc, ord, chr chop, chomp, printf, sprintf ČVUT FIT, BI-SKJ Perl, J. Škvor, březen 2011
11
Perl: vstup • diamantový symbol <> print "zadej "zadej cislo:"; cislo:"; $cis = <STDIN>; print "zadej "zadej jmeno:"; jmeno:"; $jm = <STDIN>; chomp($jm); chomp($jm); #\n chomp($jm = <STDIN>); • while ($radek ($radek = <STDIN>) { print $radek $radek; radek; } ČVUT FIT, BI-SKJ Perl, J. Škvor, březen 2011
12
Perl: řídící struktury • if (podmínka) { true příkazy; }
else { false příkazy; } • if ... elsif ... • unless (podmínka) { false příkazy; } else • modifikátory: příkaz if podm; příkaz unless podm;
ČVUT FIT, BI-SKJ Perl, J. Škvor, březen 2011
13
Perl: cykly • while (podmínka) { príkazy } until (podmínka) { príkazy } #negace • modifikátory: příkaz while podmínka; příkaz until podmínka; #negace • do {} while (); # alespon 1x do {} until ();
ČVUT FIT, BI-SKJ Perl, J. Škvor, březen 2011
14
Perl: cykly • for ($i = 0, $j=10; $i < 10; $i++, $j--) { } • NAVESTI: while (podm) { last NAVESTI if neco; next NAVESTI unless necojineho; redo NAVESTI if jestenecojineho; } continue { iterační blok } • foreach $x (2, 3, 5, 7, 11, 13) { print $x } ČVUT FIT, BI-SKJ Perl, J. Škvor, březen 2011
15
Perl: implicitní proměnná • while ($radek = <STDIN>) { print $radek } • while ($_ = <STDIN>) { print $_ } • while (<STDIN>) { print } • print $radek while ($radek = <STDIN>); • print while <STDIN>; • print while <>; ČVUT FIT, BI-SKJ Perl, J. Škvor, březen 2011
16
Perl: pole • @ovoce=("jab ovoce=("jabl =("jablko","hruska","svestka"); ko","hruska","svestka"); @ovoce= ovoce= qw/jablko hruska svestka/; svestka/; • print $ovoce[0]; # prvek zač začíná $ print $ovoce $ovoce[ ovoce[-1]; print "@ovoce "@ovoce"; ovoce"; • ($prvni ($prvni, prvni, $druhe $druhe) druhe) = @ovoce @ovoce; ovoce; @ovoce = (@ovoce (@ovoce, ovoce, "sliva "sliva" sliva", @tropicke); tropicke);
ČVUT FIT, BI-SKJ Perl, J. Škvor, březen 2011
17
Perl: pole • poslední index • počet prvků: nový na konec:
$#ovoce $#ovoce $delka = @ovoce @ovoce; ovoce; @ovoce[@ovoce]='kiwi'; ovoce[@ovoce]='kiwi';
• slices @ovoce[0, 3] = qw/tresen bluma/; bluma/; @prvni_posledni = @ovoce[0, -1];
ČVUT FIT, BI-SKJ Perl, J. Škvor, březen 2011
18
Perl: pole • foreach $ovo (@ovoce (@ovoce) ovoce) { print $ovo $ovo }
• odkazem! foreach $ovo (@ovoce (@ovoce) $ovo= uc($ovo) ovoce) { $ovo ovo=uc($ovo) } • @radky = <STDIN>; # pozor! cely soubor
• funkce: push, pop, shift, unshift, splice, map, grep, split, join, sort ČVUT FIT, BI-SKJ Perl, J. Škvor, březen 2011
19
Perl: pole - sort • sort { $a cmp $b } @pole • sort { $a <=> $b } @pole • sort funkce @pole
ČVUT FIT, BI-SKJ Perl, J. Škvor, březen 2011
20
Perl: asociativní pole • index: cokoliv; klíč => hodnota • %telef = (' ('pepa pepa' pepa' => '123456789', ‘lojza' lojza' => '111222333‘ '111222333‘); • %telef = qw/pepa 1234 lojza 1112/; • print $telef $telef {'pepa {'pepa‘ pepa‘}; • $telef {'franta {'franta'} franta'} = 888000888; • @jmena = keys %telef %telef; telef; • @cisla = keys %telef %telef; telef;
ČVUT FIT, BI-SKJ Perl, J. Škvor, březen 2011
21
Perl: asociativní pole • užití: tabulky ala telef. seznam čítače, strukturované dat. typy • foreach $jm (sort keys %telef %telef) telef) { print "$jm "$jm: jm: $telef{$jm} $telef{$jm}\ telef{$jm}\n"; } • while (($jm (($jm, jm, $tel $tel) tel) = each (%telef (%telef)) telef)) { ... }
• rozdíl: $telef{pepa}=''; telef{pepa}=''; $telef{pepa}= telef{pepa}=undef }=undef; undef; delete $telef{pepa $telef{pepa}; telef{pepa};
funkce defined, exists ČVUT FIT, BI-SKJ Perl, J. Škvor, březen 2011
22
Perl: asociativní pole • slices @telef {petr, petr, pavel} pavel} = qw/222 444/; ($petr ($petr, petr, $pavel $pavel)=@ pavel)=@telef{petr,pavel )=@telef{petr,pavel}; telef{petr,pavel}; • @mesice = qw/ qw/le un br du kv ce/; ce/; @rimsky = qw/I qw/I II III IV V VI/; VI/; @rim2mes { @rimsky @rimsky } = @mesice @mesice; mesice; • print $ENV{PATH}; • while (<>) { for (split//) split//) {$x{ {$x{$_} $_}++}} ČVUT FIT, BI-SKJ Perl, J. Škvor, březen 2011
23
Perl: soubory • open SOUB, ‘~/dopisy/babicce.txt ~/dopisy/babicce.txt'; dopisy/babicce.txt'; open SOUB, ‘>~/dopisy/babicce.txt >~/dopisy/babicce.txt'; dopisy/babicce.txt'; open SOUB, ‘>>~/dopisy/babicce.txt >>~/dopisy/babicce.txt'; dopisy/babicce.txt'; • open (SOUB, 'dopis.txt 'dopis.txt‘ dopis.txt‘) || die(“ die(“Neni"); Neni"); unless ((-e 'dopis.txt 'dopis.txt‘ dopis.txt‘) { ... } • $radek = <SOUB>; @radky = <SOUB>; • print SOUB “Ahoj babi! babi!”; • close SOUB; ČVUT FIT, BI-SKJ Perl, J. Škvor, březen 2011
24
Perl: soubory | • open F, "ls - l |"; open F, "| sendmail ... "; • open F, "$soubor.txt"; open GZ, "| gzip > $soubor.gz"; while (
) { print GZ; } close F; close GZ; • open GZ, "gunzip -c $soubor.gz |"; open F, ">$soubor.kopie"; print F while (); close F; close GZ; ČVUT FIT, BI-SKJ Perl, J. Škvor, březen 2011
25
Perl: soubory • open F, "+< $soubor"; $soubor"; open F, "+ "+> > $soubor"; $soubor"; open F, "+>> "+>> $soubor"; $soubor";
• seek, eof, sysread, syswrite
ČVUT FIT, BI-SKJ Perl, J. Škvor, březen 2011
26
Perl: souborové operátory • • • • • • •
-e existence -r lze číst -w lze psát -d adresář -T textový -M modifikace ... ČVUT FIT, BI-SKJ Perl, J. Škvor, březen 2011
27
Perl: adresáře • @soubory = <*.pl> while (<*.html>) { ... } • opendir DIR, $adresar $adresar; adresar; @soubory = readdir DIR; closedir DIR;
ČVUT FIT, BI-SKJ Perl, J. Škvor, březen 2011
28
Perl: regulární výrazy • operátor srovnání =~
!~
• while ($radek ($radek = <>) { if ($radek ($radek =~ m/vzor/) m/vzor/) print $radek $radek; radek; • while (<>) { if (/vzor (/vzor/) vzor/) { print; }} • while (<>) { print if /vzor /vzor/; vzor/; } • while (<>) { /vzor /vzor/ vzor/ && print; } • perl –ne ‘print if /vzor/’; soubor perl –ne ‘/vzor/ && print’; soubor ČVUT FIT, BI-SKJ Perl, J. Škvor, březen 2011
29
Perl: regulární výrazy • meta . [ ] [^ ] \ | ^ $ ( ) (?■ )
• třídy \d \D \w \W \s \S \b \B \z \Z \A
• kvantikvantifiká fikátory * + ? {m} {m,n} {m,}
ČVUT FIT, BI-SKJ Perl, J. Škvor, březen 2011
• modimodifiká fikátory i g x e
30
Perl: regulární výrazy • $hracky=q/ hracky=q/mam =q/mam 123 auticek 56 lodicek a 32 parnicku/; parnicku/; $pocet = @pocty = $hracky $hracky =~ /(\ /(\d+)/g; • $passwd= passwd= #zaznam #zaznam z /etc/passwd /etc/passwd q|root:x:0:1:Superq|root:x:0:1:Superuser:/root:/sbin/sh|; ČVUT FIT, BI-SKJ Perl, J. Škvor, březen 2011
31
• kvantifikátory = hladové! => *? ($un, $home) = $passwd $passwd =~ /(.*?):.*?:.*?:.*?:.*?:(.*?)/;
• lépe => negace ($un, $home) = $passwd $passwd =~ /([^:]*):(?:[^:]*:){4}:([^:]*)/; • ($un, $home) = $passwd $passwd =~ /([^:]*):(?:([^:]*):){5}/; ČVUT FIT, BI-SKJ Perl, J. Škvor, březen 2011
32
Perl: regulární výrazy • $radek =~ s/vzor/ná s/vzor/náhrada/; hrada/; • $radek =~ s/(\ s/(\w+)\ w+)\s+(\ s+(\w+)/\ w+)/\2 \1/; • $vyplaty = q/pepa novak 12345/; $vyplaty =~ s/(\ s/(\d+)$/$1*1.10/e; • $radek =~ tr/atr/a-z/dz/d-zaza-c/; $pocet_hvezd = ($radek ($radek =~ tr/*/*/); tr/*/*/); $pocet = $radek $radek =~ tr/ tr/ //d; $pocet = $radek $radek =~ tr/ tr/ //s //s; ČVUT FIT, BI-SKJ Perl, J. Škvor, březen 2011
33
Perl: funkce • sub prvocislo{ prvocislo{ # parametry v poli @_ => $_[0] for ($d=2; $d<=sqrt $d<=sqrt($ sqrt($_[0] ($_[0]) _[0]); $d++) $d++){ $_[0] % $d || return 0; } return 1; } print &prvocislo($x &prvocislo($x) prvocislo($x) ? "ano "ano" ano" : "ne“ "ne“;
ČVUT FIT, BI-SKJ Perl, J. Škvor, březen 2011
34
Perl: funkce • parametry @_ odkazem proměnný počet parametrů – rozlišení? • sub koduj{ koduj{ tr/atr/a-z/d-zaza-c/ for (@_) }
ČVUT FIT, BI-SKJ Perl, J. Škvor, březen 2011
35
Perl: funkce • sub x{ x{ for ($i=0; $i < 10; $i++) { print "*" } } sub y{ for ($i=0; $i < 10; $i++) { &x() } } &y();
ČVUT FIT, BI-SKJ Perl, J. Škvor, březen 2011
36
Perl: funkce • sub x{ x{ for (my $i=0; $i < 10; $i++) { print "*" } } sub y{ for (my $i=0; $i < 10; $i++) { &x() } } &y();
ČVUT FIT, BI-SKJ Perl, J. Škvor, březen 2011
37
Perl: funkce • sub x { #jak na parametry hodnotou my $parametry $parametry = @_; my ($par1, $par2) = @_; my ($par1) = shift; my ($par1, $par2) =(shift,shift =(shift,shift); shift,shift); return $par1 + $par2; } &x(3, 5); print(&x(@cisla)); print(&x(@cisla));
ČVUT FIT, BI-SKJ Perl, J. Škvor, březen 2011
38
BIBI-SKJ: Perl Pokračování příště... Příprava studijního programu Informatika je podporována projektem financovaným z Evropského sociálního fondu a rozpočtu hlavního 39 města Prahy. Praha & EU: Investujeme do vaší budoucnosti