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 * Arrays * Associative arrays * Filhåndtering * Regulåre udtryk * Flowcontrol * 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; - 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=("a" => 7, "sort" => "000", "gul", "0FF"); - adresering: $as{'a'} = "0F5"; - 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") + '' eller < + > + >> - 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 - <> - læser en linie fra @ARGV-filerne til $_ - -e - eksisterer filen? - -d - er den et directory? - <*.c> - liste af filer, der slutter på .c %%slide Regulære udtryk - udformning * Matching af tegn - . = alle tegn - a = tegnet a - \s = white space - \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...c med d...f (case insensitiv): s/a(.*)c/d$1f/gi - Udskift et perl-udtryk med værdien af det: s/\$.-\$./$1/e * Bestemmelse af destination - Udskift globalt i $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: -e 'print "abc\n";' * Implicit while(<>) {...}: -n * Implicit while(<>) {...; print}: -p * Inplace substitution: -i * Udskift abc med def globalt i fil: perl -i -pe 's/abc/def/g' fil %%slide Eksempler * Lav om til : find . -type f| xargs perl -i -pe 's::"":ge' * Find filer, der er fælles for n kataloger: #!/usr/bin/perl @files=<*>; for $dir (@ARGV) { @files = grep(-e "$dir/$_", @files); } print join("\n",@files); - eller: perl -e '@files=<*>;for $dir (@ARGV) { @files = grep(-e "$dir/$_", = @files); } print join("\n",@files);' kataloger... * Unikke linier: perl -ne '$a{$_}++ or print' files... * Lav slidesæt: #!/usr/bin/perl $/="%\%slide"; %than=("<" => "<", ">" => ">" ); while(<>) { my @HTML; for (split(/\n+/,$_)) { s/(<|>)/$than{$1}/g; /^%%/ && next; /^\s*$/ && next; /^\*/ && do { push(@HTML,"

",$_,"

"); next; }; /^ \-/ && do { push(@HTML,"

    ",$_,"

"); next; }; /^ \+/ && do { push(@HTML,"

      ",$_,"

"); next; }; /^\S/ && do { push(@HTML,"

",$_,"

"); next; }; { push(@HTML,"
",$_,"\n
"); next; }; } $slide++; open(FH,">slide.${slide}.html") || die; print FH "",@HTML,""; close FH; }