Perl * Kombination af C, shell, Pascal, sed, awk m.fl. * Procedurelt sprog med OO-udvidelser * Uvurderligt til system-administration * Fordele: - dynamisk lager tildeling - syntax + kort + tilgivende - effektiv + datastrukturer + strenghåndtering - mange biblioteker * Ulemper: - hastighed %%slide Perl - emner * Scalars - simple variabler * Arrays * Associative arrays * Filhåndtering * Regulåre udtryk * Flowcontrol - løkkestrukturer * Kommandolinie * Eksempler %%slide Scalars * Simpleste variabeltype - tal - strenge * Navngivning - $s * Operationer - tildeling: $s="abc"; - increment: $s++ - strengconcatenation: $s . "def" - +=, -=, .= - split til array: split(/b/,$s); - fjern newlines: chomp($s); * Magisk variabel - $_ %%slide Arrays * Arrays i C * Navngivning - @a * Operationer - tildeling: @a=("A", 7, 5.3); - adressering: $a[3]=3.5; - på ender: push(@a,"h"); $s=pop @a; $s=shift @a; unshift(@a,$s); - sammensætning til scalar: $s=join("\n",@a); - grep: @b=grep(/A/,@a); - map: @b=map { $_++ } @a; * Magisk variable - nr på sidste element: $#array - kommandolinie argumenter: @ARGV %%slide Associative arrays * Indexering via strenge (DBM) * Mappning fra et array over i et andet * Hurtig * Operationer - tildeling: %as=("blå" => "00F", "sort" => "000", "gul" => "0FF"); - adresering: $as{'grøn'} = "0F0"; - alle nøgler: @a = keys %as; - alle værdier: @a = values %as; - et (nøgle, værdi) par af gangen: ($key,$val)=each %as; * Kan ofte bruge, hvis man får en alternativ ide %%slide Filhåndtering * Filehandle * Operationer - open(FH,"file") + "file" eller "file" = skriv + ">>file" = tilføj - close FH - læs en record (linie): $line=; - læs en hel fil: @lines=(); - set record-separator: $/="\n\n"; - skriv til en filehandle: print FH "Hello\n"; * Magi - $a=<> - læser en linie fra filerne på kommandolinien (@ARGV) til $a - -e "file" - eksisterer filen? - -d "file" - er den et directory? %%slide Regulære udtryk - udformning * Matching af tegn - a = tegnet a - . = alle tegn - \s = white space (\n\t ) - \S = non-white space - \ = escape specialtegn * Matching af position - ^ = start af linie - $ = slut af linie * Gentagelser - ? = 0 eller 1 - * = 0 eller flere - + = 1 eller flere * Grupering - (.*a) = gruperer strenge, der ender på a - gruperingsvariable: $1 .. $9 %%slide Regulære udtryk - brug * Søgning - Søg i $_ efter abc: /abc/ - Søg efter a'er + bc (case insensitiv): /a+bc/i - Søg efter abcabcabc...: /(abc)+/ * Udskiftning - Udskift i $_ abc med def: s/abc/def/ - Udskift a'er + bc med def: s/a+bc/def/ - Udskift abcabcabc med def: s/(abc)+/def/ - Udskift globalt a b'er c med d b'er f (case insensitiv): s/a(b*)c/d$1f/gi * Bestemmelse af destination - Udskift globalt i variablen $a a med b (case insesitiv): $a=~s/a/b/gi %%slide Flowcontrol * while (exp) { exp } * if (exp) { exp } elsif (exp) { exp } else { exp } * for (@array) { exp } * for ($t=0; $t<10; $t++) { exp } * &&, ||, and, or * next, last * Læs indtil du møder abc: while (<>) { /abc/ && last } * Sub-routiner: sub navn { exp } - argumenter til sub: @_ - lokale variable: my ($a,$b) = @_; - explicit/implicit return %%slide Kommandolinie * Program på linien: perl -e 'print "abc\n";' * Implicit while(<>) {...}: perl -ne '...' * Implicit while(<>) {...; print}: -pe '...' * Inplace substitution - skriv til samme fil, som læses: perl -i -pe '...' * Udskift abc med def globalt i fil: perl -i -pe 's/abc/def/g' fil %%slide Eksempel * Lav om til : find . -type f| xargs perl -i -pe 's//""/ge' - Find filer af typen alm. fil: find . -type f | - Kald perl med filerne som argumenter: xargs perl - Brug inplace substitution: -i -pe - Find : // - Beregn : /""/e - Udskift med globalt: s/.../.../g %%slide Eksempel * Skriv alle linier med mindre vi har set linien før: perl -ne '$a{$_}++ or print' files... - Brug while(<>){...} magi: perl -ne '...' - Hvis $a{$_} er defineret ( >=1), så har vi set linien før - Ellers hvis ikke defineret, skriv linien ud: print %%slide Eksempel * Lav slidesæt: #!/usr/bin/perl $/="\n%%slide"; # Brug %%slide som record separator # Lav oversættelse af < og > til HTML %than=("<" => "<", ">" => ">" ); while(<>) { # For hver %%slide gør: my @HTML; # Ny HTML-side for (split(/\n+/,$_)) { # Split record til linier # for hver linie gør: s/(<|>)/$than{$1}/g; # Udskift < og > med HTML /^%%/ && next; # Spring over linier, der starter med %% /^\s*$/ && next; # Spring over tomme linier # Linier startende med '*' skal have

/^\*/ && do { push(@HTML,"

",$_,"

"); next; }; # Linier startende med ' -' skal have

    /^ \-/ && do { push(@HTML,"

      ",$_,"

    "); next; }; # Linier startende med ' +' skal have

        /^ \+/ && do { push(@HTML,"

            ",$_,"

        "); next; }; # Linier startende med non-space (slide overskrift) skal centreres /^\S/ && do { push(@HTML,"

        ",$_,"

        "); next; }; # Alle andre linier (Perl-kode) PRE-formatteres { push(@HTML,"
        ",$_,"\n
        "); next; }; } $slide++; # Tæl slidenr op open(FH,">slide.${slide}.html") || die; # Åbn en html-fil print FH "",@HTML,""; # Skriv @HTML til filen close FH; }