From bbs@floyd.upol.czThu Feb 8 16:30:00 1996 Date: Thu, 8 Feb 1996 16:30:42 +0100 From: BBS Floyd To: hubicka@limax.paru.cas.cz Subject: #5-skolicka - PERL (fwd) *** Forwarded file follows *** Posted By: doom (Petr Snajdr) on 'Linux' Title: #5-skolicka - PERL Date: Thu Feb 8 12:25:04 1996 Co je to Perl ? ========== Perl jazyk,ktery vytvoril Larry Wall>Perl je jazyk pro manipulaci s textem,hledani v textu,tisku,je to dobry jazyk pro mnoho uloh okolo spravy systemu atd.atd.Kombinuje vlastnosti jinych ci podobnych nastroju -pr.C,sed,awk,sh a tak lide znajici tyto jazyky maji vse o dost jednodusi. Syntaxe je velice podobna synatxi jazyka c.perl je vhodny pro rychlou manipulaci s fvelkym mnoztvim dat.perl umi pracovat s cisly,retezci,zna rekurzi a mnoho jinych veci. Dokumenmtace k perlu je pristupna volne na Interentu a je ji mozno ziskat treba na adresach: http://www.metronet.com/0/perlinfo/perl5/manual/perl.html http://web.nexor.co.uk/perl/perl.html (Europe) ,ale je ji mozno ziskat i v poscriptu.Pro ty kdo neradi ctou to ale cteni nei..mam asi 240 stran... Je Perl obtizny? =========== neni.Hodne lidui ho pouziva prave pro jeho "jednoduchost".Co je jednoduche a co neni - tot ovsem otazka...Pokud ale znas C,sh ap...je to hracka.... Pr:Chci neco zobrazit na monitoru (klasicke "hello World") #!/usr/local/bin/perl print "Hello World\n"; a je to ;-)))) Par lidi se dokonce ptalo - muzou programy v Perlu nahradid /bin (cc,gcc,grep,sed,awk)??????.No vecina veci lze napsat v Perlu,ale mys;lim,ze by to bylo trochu radikalni reseni... Dalsi vyhodou Perlu je ,ze je ho mozno najit primo na interneetu.Je mozno pouzit ftp,uucp,najdete ho na www..proste vsude... Perl je take portovan na kde co.neni problem ho najit na Unixovych strojich,ale na ty na kterych neni se muzes pokusit ho kompilovat sam.Pripadne problemy pak je mozno resit na comp.lang.perl Perl je take portovan na mnoho neunixovskych stroju - MS DOS,Win 3.1,NT,Mac,OS/2 nebo treba i amigu.Perl muzete pouziva pod Solarisem,Nextem..atd.atd... Pro perl jsou k nalezeni nektere zajimave veci..treba interface do SQL ap. Jak pouzivat Perl Interaktivne ? ======================= Jednou z jednodusich cest je pustit ho jako perl -de 0,ale opravdovi hackeri pouzivaji perl -de 1 ;-) Ted muzes prohlizet Perl kod,muzes zkouset symbol table,nakouknou do stacku,nastvovat brakpointy atd...Vysledny kod je mozno "testovat " i jinak.je dostupny treba i Perl Profiler,ale neni soucati distribuce. Tak a ted neco z jazyka: ================== Co v perlu znamenaji tu vsechny @$%*..atd? Jsou to indetifikatory typu: ==================== $ skalarni hodnota @ indexov. zaznam cisel % zaznam indexovanch stringu * vsechno (vsechny typy ) <> toto se pouziva pro vstup ze spouboroveho "handle" takze $prom=4 ;celociselna hod. $prom=4.8; ;cislo $prom=6.2e4 $prom='dog' ; string $prom="dog\n";String se soubory se pracuje takto: open (FILE, ">/tmp/foo.$$"); Otevrit close FILE; Uzavrit $foo = "test01"; open($foo,"file"); ...a otevreli jsme soubor. while (<$foo>() while ()() .. oba by meli delat totez. close $foo close TEST01 ... opet totez while (<$TEST01>) {} # error ^ale toto je chyba !!!! Napiseme si ted jednoduchy program,ktery bude pocitat od 10 k 0 a pocka mezi jednotliv. odectenim 1 sec. #!/usr/bin/perl $countdown = 10; while ($countdown !=0 ) { print "$countdown..\n"; sleep 1; --$countdown; } print "BOOM!\n"; A odpocitavaci program je hotov.Nepripomina vam to neco ???? ;-))) Operatory pro porovnavani,srovnavani atd. ================================= cislo string == eq != ne > gt >= ge < lt <= le tak a ted muzeme napsat program ,ktery tiskne linuk - pokud neni cista: while(<>) { chop; #remove new line if ($_ ne "") { print $_,"\n"; } } Toto C-like orientovany program a nize je tomu uz uplne jinak: while (<>) { print unless $_ eq "\n"; } ..a jsou i dalsi moznosti.. principem snad ma byt,ze muzes psat stylem jakym se clovek naucil jiz driv a nemusite nic na tom menit.... A muzeme se vrhnout na obtiznejsi program.Vytvorime rouru s unixovskym find a budeme tisknou vsechny textove soubory a to i s temi co jsou v podadreasrich. #!/usr/bin/perl open(FIND, "find . -print |") || die "nemuzu pustit find: $!\n"; # v $! je ulozena chybova # hlaska z utrob OS FILE: while (4filename = { chop $filename; next FILE unless -T $filename # test jestli je soubor #textovy..jinak skok na navesti FILE: if (!open(TEXTFILE,$filename)){ print STDERR "nemuzu otevrit $filenajme...\n"; next FILE; } while () { forreach $word (@argv) { if (index($_,$word)>=0 { print $fiulename,"\n"; next FILE; } } } } @ARGV je seznam parametru na prikazove radce pomoci index() jsme v nactenem radku hledali slovo zadane na prikazove radce...a tak nas program toho umi najdenou trochu vic,ale jak to bylo jednoduche,ze ? K tem parameetrum prikazove radky: Jsou v ARGV a ARGV jako typ array se pise @ARGV.Pokud se chceme odkazovat na jednotlive polozky...jde to pomerne jednoduse: $ARGV[0] je prvni a $ARGV[$#ARGV] ta posledni... Pokusime se to pouzit v programuu,ktery se bude chovat jako unixove echo: #!/usr/bin/perl forreach $i (0 .. $#ARGV) { print $ARGV[$i]; if ($i == $#ARGV) { print "\n"; } else { print " "; } } a je to ;-))))))))) Sve seznamy muzeme vytvaret taky a take jednoduse: @count = (1,2,3,4,5,6); nebo treba @barvy = ( $red,$green,$blue); Perl dovoluje i nasledovne pouziti: ($red,$green,$blue) = (0..2); ($name,$pw,$uid,$gid,$gcos,$home,$shell) = slit ( ?:/,); Split( .. ) nacte zaznam z /etc/passwd a naplni jim nase pole ci strukturu.... Pokud chceme neco zmenit je to jednoduche: $ARGV[si] = 'nova hodnota'; nebo uplne stejny efekt ma: splice (@ARGV,si,1,'nova hodnota'); a splice vrati straou hodnotu ( je to prece fn.) Dalsi pr.: @a = (1..3); # totez jako @a = (1,2,3); @b =(0,@a,4); # @b = (0,1,2,3,4); Dalsim prikladem bude program,ktery vypise jmena vsech textovych souboru na radek #!/usr/bin/perl while (@ARGV) { $file = shift @ARGV; push(@textfiles,$file) if -T $file; } print join(' ',@textfiles),"\n"; asi kazdy uz vi co delaji prikaz shift a push ;-) shift tak nejak "vytahuje" parametry z @ARGV a push pripojuje k $filename obsah $file Perl ma tke svuj grep.Je to asi neco jao stejnojmeny unix-prikaz. Pouziti je jednoduche.treba: print join(' ',grep(-T,@ARGV)), "\n"; a pokud chceme treba vystup tridit podle abecedy: print join(' ',sort grep(-T,@ARGV)),"/n"; nebo print join(' ',reverse sort grep(-T,@ARGV)),"/n"; Co vse se da jeste pouzit ? Tak treba print: print ((1+3)*20); print STDOUT (1+3)*20; Take je pomalu na case se vratit k nasi implementaci prikazu echo.Tak jak jsme si ji napsali je dobra,ale ma jednu chybu..desne pomala.Jde ji udelat pomerne vyrazne rychlejsi ;)) : #!/usr/bin/perl print "@ARGV\n"; tim,ze ji prevedeme na string ;-))))))))))) ,ale pozor print '@ARGV\n'; a vystupem bude retezec @ARGV\n ..tedy neco uplne jineho ! V prikaze print muzeme za \ pouzivat vse co zname v C...\n\r\t\f\b\o,ale je tu i spousta novych.... Datove struktury je mozno vytvaret i jine,nez jen pole.Naprco znamena toto asi vseci vite: %longday = ( 'Mon','Monday', 'Tue','Tuesday' , '...... ); Pouziti je pak jednoduche: $longday = $longday{substr($date,0,3)}; o0d tohoto pak jiz nei problem "odvozit" i pouziti enviromentu a signalu: $home = $ENV{'HOME'}; $SIG{'HUP} = 'IGNORE'; V programu je samozrejmosti pouziti starych znamosti: #include "filename" #include ------------------------------------------------------------------------------- --------------------------------------------------------------- tak to by na uvod mohlo byt dost.Vice nekdy priste. Omlouvam se za vsechny chyby a pripadne nejasnosti. Petr Snajdr (DOOM) mysnajdr@vszbr.cz Copyright (c) 1996,All rights Reserved http://www.vszbr.cz/ll Rights Reserved -- omlouvam za vsechny hrupky v co jsem udelal a jeste udelam ;-)))) DOOM ( alias Petr Snajdr) nebo naopak ?