P.E.R.L by hcw25539

VIEWS: 175 PAGES: 30

									P.E.R.L.
Pathologically Eclectic Rubbish Lister
    “I don't know if it's what you want, but it's what you get. :-) “
                                                         Larry Wall




                    Piotr Grzybowski
o czym bedzie?


historia, ludzie i ich pomysly
jezyki skryptowe cele i przyczyny
przyklad: perl
perl api
perl source
“i still say awk { print($1); } a lot”
Alfred A ho
              Hall Of Fame




                                      Larry Wall
                  Peter W einberger

                   AWK                 PERL
Brian Kernighan
        Hall Of Fame


Guido van Rossum     Yukihiro Matsumoto
python               ruby




       Jim Hugunin
       jython               Spock
Antologia jezykow dynamicznych

         awk
         perl
         python/jython
         ruby
         parrot (VM)
 Troche dat

1977 awk
1987 perl 1.000
1991 python
1993 ruby
1997 jython
2001 parrot
 Jezyki skryptowe::cele
“Although the Perl Slogan is There's More Than One Way to Do It,
                   I hesitate to make 10 ways to do something. :-)“
                                                       Larry Wall
szybkie operacje – zoptymalizowany kod

krotkie kody, przejzysta skladnia – od ideii do realizacji

przenosnosc – nowe systemy, nowe problemy

skalowalnosc – nowe uzadzenia, nowe wyzwania
  Jezyki skryptowe::dlaczego?
 ”A truly great computer programmer is lazy, impatient and full of
                                                         hubris”
                                                      Larry Wall
 Przyklad: zamiana slow miejscami
 perl:
#perl -e '$_=$ARGV[0]; s/(\w+) (\w+)/$2 $1/; print;' "acha tak"

 bash:
#w=”acha tak”;
echo `echo $w | cut -f2 -d ' '` `echo $w | cut -f1 -d' '`

 c/c++/java:
/* wiecej niz 1 linijka .. + kompilacja,

 ilosc operacji: WIECEJ niz jedna */
Przyklad::Perl


●   przykladowe kody
●   skladnia
●   kontekst
●   funkcje
●   wyrazenia regularne
                  Przyklad::Perl::
                    HelloWorld
  z dowolnego shella:
#perl -e 'printf(“\nHello World!!\n”);'


  inaczej, uruchomiony z pliku:
#!/usr/bin/perl
printf(“\nHello World\n”);

  prawa wykonania:
#chmod 755 ./helloworld


  uruchomienie:
#./helloworld
                 Przyklad::Perl::
                 dodajKolumny
  Parametry: ilosc kolumn, operacja.
#echo -ne “1 3\n8 -6\n” | ./malipulate_columns 2 +
  ma wypisac:     4
                  2

#!usr/bin/perl
my $columncount=$ARGV[0];
my $columnoperation=$ARGV[1];
$i=0;
while(<STDIN>) {
 my @coldata=split(/ /);
 if ($#coldata>$columncount) { printf(“line %d too
much\n”,$i); }
 if ($columnoperation eq '+') {
   print(($coldata[0]+$coldata[1]) . “\n”);
 }
 $i++;
};
               Przyklad::Perl::
                zamienSlowo
Parametry: string, slowo do zamiany, na co zamienic:

   #!usr/bin/perl
   @word=split(//,$ARGV[1]);
   $changeto=$ARGV[2];
   my @data=split(//,$ARGV[0]);
   for($j=0;$j<=$#data;$j++) {
    for($k=0;$k<=$#word;$k++) {
      if ($data[$j]!=$word[$k]) {
       $notfound=1; break;
      };
    };
    #jesli !$notfound to zamiana.. itd..
   };
              Przyklad::Perl::
               zamienSlowo
Parametry: slowo do zamiany, na co zamienic.
oczywiscie mozna tez tak:
 #!usr/bin/perl
 $ARGV[0]=~s/ $ARGV[1] / $ARGV[2] /;
 print($ARGV[0]);
                    Przyklad::Perl::
                       skladnia
poza definicja, deklaracja i uzyciem zmiennych
kazdy kod prawidlowy skladniowo w c jest
prawidlowy skladniowo w perlu (*)
  if ($i>10||$string eq “hej”) {
    for($i=0;$i<$count;$i++) {
    }
  }
  while(1) {
    my $variable;
    my @array;
    my %hash;
  }
(*) nie prawda dla deklaracji/definicji funkcji, dyrektyw preprocesora
i switch
                   Przyklad::Perl::
                      kontekst
Zmienne sa deklarowane jako skalary, tablice lub
hashe, ale skad wiadomo co zwraca np. split?

   # z kontekstu!
   $i=10; # scalar context
   @array=[“acha”,”achaaa”]; # array context
   $values=split(//,$string); # scalar context
   @array=split(/[a-z]/,$anotherstirng); # array context




Odwolanie do elementu tablicy to jaki kontekst?
Co zwroci split(/ /,$string);?
                   Przyklad::Perl::
                       funkcje
perl jest jezykiem w ktorym definiuje sie funckje:

   sub getwords {
    my @params=@_;
    if ($#params<0||length($params[0])<=0) {
     return “”;
    }
    my @table=split(/[^a-zA-Z0-9]/,$params[0]);
    return \@table;
   };
Jak wywolac getwords?
Co to znaczy: $w=getwords(“hej hej hejehej hejhej”);?
          Regular Expressions

zalety:
  sa przenosne
  sa szybkie
  sa uniwerslane
  sa tutaj od bardzo dawna
  sa tutaj zeby pozostac
  nie sposob ich nie uwielbiac


wiecej zalet?
           Regular Expressions

przyklady:
  lista znakow:
    /[a-z]tak/

    pasuje do: “fdsafdsafdstak”,”ttak”
  znak poczatku lini:
    /^0\.4/
    pasuje do: “0.4” i wszsytkiego co zaczyna sie na “0.4”
  znak '+': dopasuj jeden lub wiecej razy:
    /tak [A-Zbga]+ no/
  znak '*': dopasuj zero lub wiecej razy:
    /^[a]+? .*/
            Regular Expressions::
               podsumowanie
znaki specjalne:
  dowolny znak:
    /./
  znak poczatku lini:
    /^/
  znak konca lini:
    /$/
  kontrola ilosci dopasowan:
    *        Match 0 or more times
    +        Match 1 or more times
    ?        Match 1 or 0 times
    {n}      Match exactly n times
    {n,}     Match at least n times
    {n,m}    Match at least n but not more than m times
          Regular Expressions::
             podsumowanie
znaki specjalne:
  lista znakow:
    /[a-zA-Z0-9\x033@!]/

  zaprzeczenie listy:
    /[^ K\-\.]/

  escape character: ”\”:
    /[\$\-\.\\]/
           Regular Expressions::
            operators&modifiers
operacja:
  s jak search:
    s/$pattent/$replacement/
  m jak match:
    m//
    #lub
    //
modyfikatory:
  i m s x:
   s/$pattent/$replacement/i
   s/$pattent/$replacement/m
   s/$pattent/$replacement/s
   s/$pattent/$replacement/x
        Regular Expressions::
      grouping vs backreference
przyklad, zamien slowa miejscami.
  lancuch:
      $string=”pierwszeslowo drugieslowo”;
  dopasuj niespacje:
      /[^ ]/
  slowo: string bez spacji (zbior niespacji):
      /[^ ]+/
  dwa slowa (lancuchy odzielone spacja):
      /[^ ]+ [^ ]+/
  jak dostac sie do kawalka wzorca (pattern'u)?:
      #grouping
      s/(a+) (b+)/$1/
       Regular Expressions::
     grouping vs backreference
przyklad, zamien slowa miejscami.
  lancuch:
     $string=”pierwszeslowo drugieslowo”;

  poszukiwane wyrazenie regularne:
     s/([^ ]+) ([^ ]+)/$2 $1/

  kod w perlu:
     $string=”pierwszeslowo drugieslowo”;
     $string=~s/([^ ]+) ([^ ]+)/$2 $1/;
     print($string);
       Regular Expressions::
     grouping vs backreference
przyklad, zamien slowa i wstaw pierwsze.
  lancuch:
     $string=”pierwszeslowo pierwszeslowo drugieslowo”;

  poszukiwane wyrazenie regularne:
     /([^ ]+) \1 ([^ ]+)/$2 $1 $1/

  kod w perlu:
     $string=”pierwszeslowo pierwszeslowo drugieslowo”;
     if ($string=~s/([^ ]+) \1 ([^ ]+)) {
      printf(“%s %s %s”,$2,$1,$1);
     }
           Regular Expressions::
                   greed
znaki '*' i '?' i kontrola ilosci dopasowan:
   jak wyciagnac pierwsze 'a' z lancucha:
      $string=”|a|b|c|d|e|f|”;
   nasuwa sie:
      /^\|(.*)\|.*/
   a rozwiazanie brzmi:
      /^\|(.*?)\|.*/
            Regular Expressions::
               podsumowanie
przyklad: prosty xml:
   wyciagnij dane pierwszego taga “row”:
       $string=”<tab> <row> rowdata0 </row>
                  <row> rowdata1 </row> </tab>”;
   nasuwa sie:
       s/<row>(.*)</row>/$1/




Jak wyciagnac rowdata0?
Jak wyglada kod w perlu do wyciagniecia rowdata0 i rowdata1?
          Przyklady z zycia (1/4)

/var/spool/mail:
  czyj inbox zajmuje najwiecej miejsca?:
    #ls -al /var/spool/mail
    total 1452784
    -rw-------     1 user0 mail   319718 Mar   4 15:43 user0
    -rw-------     1 user1 mail 4027259 Mar    6 15:30 user1
    .
    .

  cel: segregacja wzgledem rozmiaru:
    user1 3.84Mb
    user0 0.30Mb
    .
    .
           Przyklady z zycia (2/4)

$apacheroot/logs/access_log:
  kto sciaga movies.dvdrip.avi?
    #cat $apacheroot/logs/access_log
    64.233.187.99 - - [08/Feb/2006:02:22:30 +0100] "GET
    /movies.dvdrip.avi HTTP/1.1" 200 216
    72.14.207.99 - - [08/Feb/2006:02:22:30 +0100] "GET
   /img/img0.gif HTTP/1.1" 200 216
   .
   .
  cel: kto i kiedy?
   64.233.187.99 08/Feb/2006:02:22:30
   64.233.167.99 09/Feb/2006:03:22:12
   .
   .
           Przyklady z zycia (3/4)

$apacheroot/logs/access_log:
  ilosc odwolan (wizyt)?
    #cat $apacheroot/logs/access_log
    64.233.187.99 - - [08/Feb/2006:02:22:30 +0100] "GET
    /movies.dvdrip.avi HTTP/1.1" 200 216
    72.14.207.99 - - [08/Feb/2006:02:22:30 +0100] "GET
   /img/img0.gif HTTP/1.1" 200 216
   .
   .
  cel: kto i ilerazy?
   64.233.187.99 x432
   72.14.207.99 x32
   .
   .
            Przyklady z zycia (4/4)

'root from':
   kto loguje sie na roota:
    #cat $sshlog | grep 'root from'
    Mar    4 16:04:27 host sshd[14423]: error: Couldn't
    authenticate root from 64.233.161.99
    .
    .

   cel: skad i ile razy:
    64.233.161.99 x4
    64.233.161.147 x2
    .
    .

								
To top