From bbs@floyd.upol.czThu Feb  8 16:30:00 1996
Date: Thu, 8 Feb 1996 16:30:42 +0100
From: BBS Floyd <bbs@floyd.upol.cz>
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 (<TEST01>)()
                             
                           .. 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 = <FIND> {
          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 (<TEXTFILE>) {
                  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 ( ?:/,<PASSWD>);

Split( .. <PASSWD> ) 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<filename>

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