270 likes | 439 Views
Practical Extraction and Report Language Miroslav Rudišin. PERL. Čo je PERL. vysoko-úrovňový interpretovvaný programovací jazyk vyvinutý pôvodne pre prácu s textom Larrym Wallom inšpirovaný roznymi prog. jazykmi: C, shell, sed, awk, ...
E N D
Practical Extraction and Report Language Miroslav Rudišin PERL
Čo je PERL • vysoko-úrovňový interpretovvaný programovací jazyk vyvinutý pôvodne pre prácu s textom Larrym Wallom • inšpirovaný roznymi prog. jazykmi:C, shell, sed, awk, ... • v súčasnosti sa vyžíva aj v iných oblastiach:dynamický web (CGI), systémové (konfiguračné) nástroje, grafické nadstavby nad konzolovými aplikáciami, komplexné monitorovacie nástroje,hry (Frozen Bubble), ...
Kedy nepoužívať PERL • ak musíme používať niečo iné (nariadenie zhora) • real-time aplikácie • nízkoúrovňové systémové veci (ovládače) • zložité aplikácie s množstvom vlákien so zdieľanou pamäťou • na riadenie kritických zariadení
Spúštame PERL • ako jednodychý príkaz$ perl -e 'print “Hello World!\n”;'Hello World! • ako skript$ cat > hello.pl; chmod 755 hello.pl; ./hello.pl#!/usr/bin/perlprint ( 'Hello World again!' ) ;# medzery su nepodstatné (a toto je komentár)EOFHello World again!
~ pole ~@zoo = ($zviera, “koza”);print $zoo[0]; # hadprint $zoo[$#zoo]; # koza$druhov = @zoo; # 2@zoo2 = (@zoo, “vlk”);@cicavce = @zoo2[1..2]; ~ slovník (hash) ~%pocet = (“had” => 0,$zoo[1] => 20, “vlk” => 1);print “kôz je $pocet{'koza'}”;$pocet{'koza'}++; Syntax PERLu z rýchliku • print 42;print 'Hello ...\n';print “Hello ...\n”;print (“Hello ...\n”);Typy premenných • ~ skalár ~$zviera = “had”;$pocet = 0;$mix = $pocet . ' ' . $zviera;print '$mix = ',$mix,”\n”;print “\$mix = $mix\n”;
Anonymné premenné & Odkazy • $rZoo = [ { 'meno' => 'had', 'pocet' => 0 }, { 'meno' => 'koza', 'pocet' => 21 }, { 'meno' => 'vlk', 'pocet' => 1 }];print $rZoo->[0]->{'meno'}; # had • odkazy (tvrdé)$rsZviera = \$zviera; print $$rsZviera; # had$raZoo = \@zoo; print $raZoo->[0]; # had$rhPocet = \%pocet; print $rhPocet->{'had'} # 0 • symbolické odkazy (mäkké)$sObjekt = “zviera”; print $$sObjekt; # had
Dosah premennýchgarbage collecor • $a = 20; $x = sub { print "$_[0]: $a, @b\n"; };$x->("0ob");{ local ($a); my (@b); $y = sub { print "$_[0]: $a, @b\n"; }; $a = 10; @b = ("koza", "vlk"); $x->("1oi"); $y->("1ii");}$x->("0oa"); $y->("0ia"); • 0ob: 20,1oi: 10,1ii: 10, koza vlk0oa: 20,0ia: 20, koza vlk
Podmienky a cykly • if ( podmienka ) { ... } elsif ( podmienka ) { ... } else { ... } • unless ( podmienka ) { ... } # ekvivalentné s if ( ! podm. ) • while ( podmienka ) { ... } ## next, lastuntil ( podmienka ) { ... } ## loop labels • for ( init ; podmienka ; krok ) { ... } # ako v C/C++ • foreach premenná ( pole ) { akcia }foreach ( pole ) { print $_; } # $_ môžeme vynechať • zložené zátvorky su nutné!výnimka: výrazy s jednou akciou, ale zapísane v tvare:print $pole[0] if (@pole); # vypíše prvý prvok poľaprint pop(@pole) while (@pole); # vyprázdňuje a vypisujeprint foreach (@pole);
left &left | ^left &&left ||nonassoc .. ...right ?:right = += -= *= etc.left , =>|nonassoc list operators (rightw.)right notleft andleft or xor Operátory • left terms and list operators (leftw.)left ->nonassoc ++ --right **right ! ~ \ and unary + and -left =~ !~left * / % xleft + - .left << >>nonassoc named unary operatorsnonassoc < > <= >= lt gt le genonassoc == != <=> eq ne cmp print($foo, exit); print $foo, exit; (print $foo), exit; print($foo), exit; print ($foo), exit;
Podprogramy • sub max { my $max = shift; # eqiv. s shift(@_) foreach $foo (@_) { $max = $foo if $max < $foo; } return $max;}print max(1,2,3,4,5,6); • $rsMax = \&max;print $rsMax->(2,4,6,8); • iné parsovanie parametrovmy ($first, $second) = @_;my $first = $_[0];
I/O • open(IN, “input.txt”) or die “...”;open(OUT, “output.txt”) or die “...”;open(LOG, “>>log.txt”) or die “...”; • my $line = <IN>;my @lines = <IN>; • print OUT process($line);print LOG $logmsg; • close IN; • <STDIN> (<>), <STDOUT>, <STDERR>
Interpret PERLu • funguje približne takto:my $str;while ($line = <>) { $str .= $line;}eval $str;
eval: reťazcový tvar • $str = '$a++; $a + $b'; # 2 výrazy$a = 10;$b = 20;$c = eval $str; # 31 • pri syntaktickej, či behovej chybe je chybová hláška uložená v $@ • nebezpečensvo:$line = <>; # $line eq “system('rm -rf /')”eval $line;
eval: blokový tvar • spracovanie behových chýb (výnimiek) • eval { $a = 10; $b = 0; $c = $a / $b;};print $@; # “Illegal division by 0 at line 3” • eval { open F, “>input.txt” or die “Nemozem ...”};
Regulárne výrazy (RE) • $hw = “Hello World!”$hw =~ /Hello/; # OKprint “first time” if $hw !~ /again/; • $pozdrav = “World”;print “zhoda\n” if $hw =~ /$pozdrav/; • “Hello World” =~ m!world!; # False$hw =~ m{World }; # False“/usr/bin/perl” =~ m”/usr”; • “That hat is red” =~ /hat/; # hat v That
Metaznaky v RE • { } [ ] ( ) ^ $ . | * + ? \ • pri testovaní musíme 'zaescapeovat' s '\' • ukotvenia: ^ $ (začiatok & koniec riadku) • triedy znakov: [ ], [^ ] (vymenovaním, interval) • skratky: \d ~ [0-9], \D ~ [^\d],\s ~ [\ \t\r\n\f], \S ~ [^\s],\w ~ [a-zA-Z0-9_], \W ~ [\^w]'.' ~ [^\n], \b ~ hranica \w\W alebo \W\w
Príklady k RE • “housekeeper” ~= /^house/; # OK“housekeeper” ~= /^keeper/; # False,“housekeeper” ~= /keeper$/; # OK“housekeeper\n” =~ /keeper$/; # OK • /cat/; /[brc]at/; “abc” = /[cab]/; /item[0-9]/; • /[Yy][Ee][Ss]/; /yes/i; # (modfikátor) • /\d\d:\d\d:\d\d/; # hh:mm:ss/\w\W\w/;/\bcat/; /\bcat\b/;
RE: výber, zoskupovanie • “cat and dogs” =~ /cat|dog|bird/; # cat“cat and dogs” =~ /dog|cat|bird/; # cat • /(a|b)b/; /(^a|b)c/;/house(cat(s|)|)/; • $time =~ /(\d\d):(\d\d):(\d\d)/;$hod = $1; $min = $2; $sek = $3; • spätné odkazy (backreferences)/(\w\w\w)\s\1/;
RE: Kvantifikátory • a? - [0-1], a* - [0-], a+ - [1-],a{n,m} - [n-m], a{n,} - [n-], a{n} – [n] • /[a-z]+\s+\d*/; /(\w+)\s+\1/; • “the cat in the hat” =~ /^(.*) (at) (.*)$/;$1 = “the cat in the h”, $2 = “at”; $3 = “”; • $x = "cat dog house"; # 3 wordswhile ($x =~ /(\w+)/g) { print "Word is $1, ends at position ", pos $x, "\n";} # cat 3, dog 7, house 13
RE: replace • s/regex/replacement/modifiers • $x = "I batted 4 for 4";$x =~ s/4/four/; # $x contains "I batted four for 4" • mod: g (global)$x = "I batted 4 for 4";$x =~ s/4/four/g; # $x contains "I batted four for four" • mod: e (eval)$x = "the cat in the hat";$x =~ s/(\w+)/reverse $1/ge;# $x contains "eht tac ni eht tah" • $x = "A 39% hit rate";$x =~ s!(\d+)%!$1/100!e; # $x contains "A 0.39 hit rate"
RE: split • split /regex/, string • $x = "Calvin and Hobbes";@word = split /\s+/, $x;# @word = ('Calvin', 'and', 'Hobbes'); • $x = "1.618,2.718, 3.142";@const = split /,\s*/, $x;# @const = (1.618, 2.718, 3.142);
Moduly • umožňujú rozdeliť program do viacerých opakovane použiteľných častí • zavedenie menného priestoru • nahrávanie pomocou 'require', alebo 'use' • prístup ku komponentom modulu cez :: • package A; $a = 0;package B; $a = 10; sub inc () { $a++; };package A; B:inc(); print $a, “,”, $B::a;
Niektoré základne funkcie • Reťazce: chomp, length, index, substr, tr/// • RE: m//, pos, s///, split • Polia: shift, unshift, push, pop • Zoznamy: join, map, sort • Slovniky: delete, each, exists, keys, values • Beh: die, eval, exit, goto, last, next • ... (man perlfunc)
Comprehensive Perl Archive Network (CPAN) • obrovská zbierka softwaru pre Perl a dokum. • 1576 MB dát (moduly, skripty, src, doc)2687 autorov4321 modulov (12. marca 2003) • kategórie: AI, Algorithm, Apache, CGI, Crypt, DBD, DBI, File, Graphics, GTK, HTML, HTTP, Image, IO, Lingua, Log, Mail, Math, MP3, Net, Postscript, QT, SQL, String, Template, Text, Thread, Tk, Unicode, Unix, Windows, WWW, XML, ...
Webový server(http://www.perlmonks.org/index.pl?node=Obfuscated%20Code) • use IO::Socket;$R="/tmp/";$P=1280;$A="HTTP/1.1 200 OK\nServer: PimpHTTPD\nConnection: close\n\n";$S=new IO::Socket::INET->new (Listen=>1,LocalPort=>$P)||die("Can't listen: $!");while($C=$S->accept()){while($D=<$C>) {$F=$1 if($D=~/^GET\s+(\S+)/i);last if($D=~/^\r?\s*\r?$/);}$F=~s/%([0-9A-Fa-f][0-9A-Fa-f])/hex($1)/g;if($F=~/\.\.\//){$A="INVALID URL"} else{if(open(I,"<$R$F")){while(<I>){$A.=$_;};close(I);}else{$A="$R$F:$!"}};print $C $A;$C->close;}
Čo sa ani nespomenulo • testy • typegloby • OOP • tie (naväzovanie na dáta) • preťažovanie operátorov • šablóny • rozširovanie PERLu • vkladanie PERLu do iných jazykov • ...
Literatúra • http://www.perldoc.com • http://www.perlmonks.org ( • http://www.perldoc.com/perl5.8.0/pod/perlintro.html • Programování v Perlu pro pokročiléComputer Press (O'Reilly)