1 / 27

PERL

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, ...

shaun
Download Presentation

PERL

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Practical Extraction and Report Language Miroslav Rudišin PERL

  2. Č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), ...

  3. 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í

  4. 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!

  5. ~ 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”;

  6. 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

  7. 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

  8. 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);

  9. 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;

  10. 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];

  11. 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>

  12. Interpret PERLu • funguje približne takto:my $str;while ($line = <>) { $str .= $line;}eval $str;

  13. 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;

  14. 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 ...”};

  15. 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

  16. 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

  17. 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/;

  18. 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/;

  19. 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

  20. 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"

  21. 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);

  22. 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;

  23. 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)

  24. 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, ...

  25. 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;}

  26. Č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 • ...

  27. 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)

More Related