Introduktion till Perl Översikt Perl som skriptspråk Relation till

Document Sample
Introduktion till Perl Översikt Perl som skriptspråk Relation till Powered By Docstoc
					                                                                                 Översikt
Introduktion till Perl                                                             Skalära värden
                                                                                   Kontroll och sammansatta värden
                                                                                   Input/Output
                                         ETE258 Skriptspråk
                           Inst. för datavetenskap (IDA)                           Subrutiner
                                     Linköpings universitet                        Filer och kataloger




                                                 http://www.ida.liu.se/~ETE258                                                         http://www.ida.liu.se/~ETE258
                               Attribution-NonCommercial-ShareAlike2.5 License                                       Attribution-NonCommercial-ShareAlike2.5 License




Perl som skriptspråk                                                             Relation till skal och Bash
  90% text 10% everything else                                                     Strängorienterat (Bourne shell)
     en stor grupp av tillämpningar! T ex webb och dokument                           “sigill” på variabler ($, @)

  Syntax lik C men betoning av skriptabilitet                                         enkel och dubbelcitat (\n kräver dubbel)

     t ex default-beteende och implicit notation                                      kommandosubstitution med `...`

     Tim Toady: “There is more than one way to do it "                             inte kommandoradsorienterat
  Skalkopplingen svagare än t ex (Ba)sh                                               satser slutar med ; alltid

  “Plattformsoberoende”: Unix, Windows, Mac                                        Inspiration från awk och sed
                                                                                      t ex hashes och regexp-substitution
  Perl 1 1987 -> Perl 5 1994 -> Perl 6 2000
                                                                                   subrutiner liknar bash men är mer generella (Perl 5)
  Kamel: “kind of ugly, but work hard in tough
  conditions”
                                                 http://www.ida.liu.se/~ETE258                                                         http://www.ida.liu.se/~ETE258
                               Attribution-NonCommercial-ShareAlike2.5 License                                       Attribution-NonCommercial-ShareAlike2.5 License
Exempel - arbetsgång                                                                 Skalära värden
$: ./my-perldoc                                                                       Strängar och tal (float och int)
Can't exec "peldoc": No such file or directory at ./my-perldoc line 3.                   automatisk konvertering
$:./my-perldoc
...                                                                                      “implicit boolean” false=0, true=resten
=item atan2 Y,X                          #!/usr/bin/perl -w
                                                                                      Typade operatorer, t ex
ATAN2 ARCTANGENT TAN TANGENT
...                                      @lines = `perldoc -u -f atan2`;                 + för heltal och . för sträng-append
                                         foreach (@lines) {
                                                                                         >= för heltal men ge för strängar
                                            s/\w<([^>]+)>/\U$1/g;
  $: perldoc -u -f atan2                    print;                                    chomp: ta bort sista \n på en sträng
                                         }
      ...                                                                                chomp($text = “a line of text\n”);
      =item atan2 Y,X
                                                                                      undef ser ut som “” i strängkontext och som 0 för tal
      X<atan2> X<arctangent> X<tan> X<tangent>
                                                                                         egentligen ett eget värde (av en tredje typ)
                                                                                         defined-function – test på undef
                                                     http://www.ida.liu.se/~ETE258                                                    http://www.ida.liu.se/~ETE258
                                   Attribution-NonCommercial-ShareAlike2.5 License                                  Attribution-NonCommercial-ShareAlike2.5 License




Exempel på skalärer                                                                  Kontroll och sammansatta strukturer
           # undef variable
           print "Wrong: Hello $world_var\n";                                         Kontroll: if, while, for, foreach, unless, until
           $world_var = 'world';
                                                                                      Liknar C-syntax men några egna t ex foreach
           # now working
           print "Hello $world_var!\n";                                               Listor och arrayer ungefär detsamma
           print 'Hello $world_var!\n';
           print "\n" . 'Dot:Hello ' . $world_var . "!\n";                               dynamiska strukturer
           print "1+1=" . ("1" + "1") . "\n";                                            listan är (hela) värdet av en array-variabel, använd @
           print “Hello” x 3 . $world
                                                                                         index-uppslagning: t ex my_array[3]
                   Wrong: Hello
                   Hello world!                                                       Hashar (eng. hashes)
                   Hello $world_var!\n
                                                                                         som en array fast nycklarna (keys) är strängar/namn
                   Dot:Hello world!
                   1+1=2                                                                 Nyckel-uppslagning: t ex my_hash{“mykey”}
                   Hello Hello Hello world
                                                                                         hash som lista: använd %
                                                     http://www.ida.liu.se/~ETE258                                                    http://www.ida.liu.se/~ETE258
                                   Attribution-NonCommercial-ShareAlike2.5 License                                  Attribution-NonCommercial-ShareAlike2.5 License
Exempel på array                                                                    Exempel på if-sats
                                                                                                                                                    ARGV special-
     @names = ("per", "olle", "stina");                                                #!/usr/bin/perl
                                                                                                                                                    array för argume
     @births = (83, 65, 77);                                                           if (index("@ARGV", "-f") != -1) {
                                                                                                                                                    @ ger hela array
     print "Name-3:" . $names[2] . "\n";                                                   print "Ok, found -f flag\n";
                                                                                                                                                    “@...” konverterin
     print "Birth-3:" . $births[2] . "\n";                                             } elsif (index("@ARGV", "-g") != -1) {
                                                                                                                                                    index är delsträn
     @merge = (@names, @births);                                                           print "Ok, found only -g flag\n";
                                                                                                                                                    index.
     foreach (@merge) {                                                                } else {
        print "$_ ";                                                                       print "Ok, this is the line: @ARGV \n" ;
     }                                                                                 }
     print "\n";
                                                                                           $: ./if-test -f b
                                              Name-3:stina                                 Ok, found -f flag
                                              Birth-3:77                                   $: ./if-test -g a
                                              per olle stina 83 65 77                      Ok, found only -g flag
                                                                                           $: ./if-test a b
                                                                                           Ok, this is the line: a b
                                                    http://www.ida.liu.se/~ETE258                                                        http://www.ida.liu.se/~ETE258
                                  Attribution-NonCommercial-ShareAlike2.5 License                                      Attribution-NonCommercial-ShareAlike2.5 License




Exempel på multidimensionell array                                                  Exempel på hash
                                                   quote words
@cars = qw/saab volvo renault honda/;
                                                                                     %name_birth = ("per" => 83, "olle" => 65, "stina" => 77);
@years = (1977, 1988, 2000);
                                                  Kopiering                          foreach $name (sort keys %name_birth) {
@{$all[0]} = @cars;
                                                  ref med \@                            print "Name $name and birth $name_birth{$name}\n";
@{$all[1]} = @years;
                                                                                     }
$all[0][2] = citroen;
                                                                                     while (($name, $birth) = each %name_birth) {
print "With cars: @cars \n";
                                                                                        print "$name => $birth ";
foreach (@all) {
                                                                                     }
   for ($i = 0; $i <= $#{$_}; $i++) {
                                                                                     print "\n";
      print "item-" . ($i + 1) . ": @{$_}[$i] ";
   }
   print "\n";
                   With cars: saab volvo renault honda
}                                                                                                 Name olle and birth 65
                   item-1: saab item-2: volvo item-3: citroen item-4: honda
                   item-1: 1977 item-2: 1988 item-3: 2001                                         Name per and birth 83
                                                                                                  Name stina and birth 77
                                                                                                  stina => 77 olle => 65 per => 83

                                                    http://www.ida.liu.se/~ETE258                                                        http://www.ida.liu.se/~ETE258
                                  Attribution-NonCommercial-ShareAlike2.5 License                                      Attribution-NonCommercial-ShareAlike2.5 License
Exempel på hash (2)                                                                  Input/Output
 %name_birth = ("per" => 83, "olle" => 65, "stina" => 77);
                                                                                      Unix-inspirerat:
                                                                                         STDIN, STDOUT, STDERR
 foreach $candidate (qw / per bengt ulla stina / ) {
    if (!exists $name_birth{$candidate}) {                                               strömmar och omriktare: <, >, >>, >& etc
        print "Not registered: $candidate\n";                                            <> “diamant-operatorn” filargument, inmatning, pipe
    }                                                                                    hanteras på samma vis
 }
                                                                                      @ARGV – liknar $@ i bash men $0 är separat i Perl
                                                                                      Filhantag (eng. filehandle)
                  Not registered: bengt                    Två hash-funktioner:
                  Not registered: ulla                                                   kommandon open och close
                                                           exist och delete...
                                                                                         $! håller ev felmedelande efter systemanrop

                                                                                      Specialformat: print MYLOG “Some text”

                                                     http://www.ida.liu.se/~ETE258                                                   http://www.ida.liu.se/~ETE258
                                   Attribution-NonCommercial-ShareAlike2.5 License                                 Attribution-NonCommercial-ShareAlike2.5 License




Exempel läs från/till konsol                                                         Exempel spara på fil
  my %name_hash;
  while (<>) {                                                                         open PERSON_FILE, "<", "person.txt";
      chomp(@name = split(/:/, $_));                   Argument-fil:                   @lines = <PERSON_FILE>;
      $name_hash{$name[0]} = $name[1];                  Ulla:Svensson                  close PERSON_FILE;
  }                                                     Olle:Nylen                     open SORT_PERSON_FILE, ">", "sorted-person.txt";
  my @names = %name_hash;                               Per:Larsson                    @sorted = sort @lines;
  print "Names on file: @names\n";                                                     print SORT_PERSON_FILE @sorted;
  print "Enter first name: ";                                                          close SORT_PERSON_FILE;
  chomp(my $fname = ucfirst <STDIN>);
  if (exists $name_hash{$fname}) {
      print "Full Name: $fname $name_hash{$fname} \n";                                   person.txt:               sorted-person.txt:
  } else {                                                                                Ulla:Svensson             Olle:Nylen
      print "Unknown name\n";                                                             Olle:Nylen                Per:Larsson
  }                                                                                       Per:Larsson               Ulla:Svensson
            Names on file: Ulla Svensson Olle Nylen Per Larsson
            Enter first name: per
            Full Name: Per Larsson
                                                     http://www.ida.liu.se/~ETE258                                                   http://www.ida.liu.se/~ETE258
                                   Attribution-NonCommercial-ShareAlike2.5 License                                 Attribution-NonCommercial-ShareAlike2.5 License
Subrutiner                                                                            Exempel subrutin
                                                                                                                                                     “fib 13”
  sigill på anrop: &                                                                    sub fib {                                                    fib(1) = 0
                                                                                          my $num = $_[0];                                           fib(2) = 1
  @_ positionella implicita parametrar
                                                                                          return 0 if $num == 1;                                     fib(3) = 1
  my definierar lokala variabler (används även i strict)                                  return 1 if $num == 2;                                     fib(4) = 2
                                                                                          return &fib($num - 1) + &fib($num - 2);                    fib(5) = 3
  en Perl-subrutin är en äkta funktion                                                  }                                                            fib(6) = 5
                                                                                                                                                     fib(7) = 8
     ...men i bash kallas det funktion men är subrutiner!                               foreach (1..$ARGV[0]) {                                      fib(8) = 13
     t ex print returnerar 1 för success; 0 failure                                       print "fib($_) = " . &fib($_) . "\n";                      fib(9) = 21
                                                                                        }                                                            fib(10) = 34
  Implicit returvärde: sista satsens värde                                                                                                           fib(11) = 55
     skriv ett uttryck som sista sats och det returneras                                                                                             fib(12) = 89
                                                                                                                                                     fib(13) = 144
     return <val> avbryter kontroll och returnerar värde <val>


                                                      http://www.ida.liu.se/~ETE258                                                          http://www.ida.liu.se/~ETE258
                                    Attribution-NonCommercial-ShareAlike2.5 License                                        Attribution-NonCommercial-ShareAlike2.5 License




Filer och kataloger                                                                   Exempel på filtest
  filtester i still liknande (ba)sh                                                                                                                              Pragma
                                                                                           use strict; # enforce strict notions
  stat och lstat ger fullständig information (jmf unix)                                    my @all_files = qw / test1 test2 test3 /;
                                                                                           my @non_empty_files;                                                 -s = file size
  localtime – hanterar timestamps                                                          foreach my $file (@all_files) {
                                                                                              if (-s $file) {
  chdir – ändrar nuvarande arbetskatalog (default                                                                                                                Funktion på
                                                                                                  push @non_empty_files, $file;
  $HOME)                                                                                                                                                         array: push
                                                                                              } else {
                                                                                                                                                                 pop
                                                                                                  print "File is empty (IGNORED): $file\n";
  glob – expandera mönster till filer, t ex                                                   }
     $all_txt_files = glob *.txt;                                                          }
                                                                                           print "Ok, found files: @non_empty_files\n";
     Alternativ: $all_txt_files = <*.txt>; (överlagrad syntax!)

  Kataloghantag: opendir, closedir
                                                                                                     File is empty (IGNORED): test2
  Unixliknande: rm, mkdir, rmdir, rename, (sym)link,                                                 Ok, found files: test1 test3
  File::FIND                          http://www.ida.liu.se/~ETE258                                                                          http://www.ida.liu.se/~ETE258
                                    Attribution-NonCommercial-ShareAlike2.5 License                                        Attribution-NonCommercial-ShareAlike2.5 License
Sammanfatting och källor
 Lama-boken: Learning Pearl 4th Ed
 www.perl.org
 Utgångspunkt textbearbetning
   fördjupning i detta nästa gång

 Förutom textbearbetning ett snabbt och bra skriptspråk
   mindre skalorienterat med C-syntax
   gott om genvägar och snabbsyntax
   enkla lösningar i botten som gradvis utvidgats...Perl 6 är
   omdiskuterat men intressant


                                                http://www.ida.liu.se/~ETE258
                              Attribution-NonCommercial-ShareAlike2.5 License