Mer reguljära uttryck Perl och reguljära uttryck foo! .! ! ! ! ordet foo vilket tecken som helst a*!! ! noll eller flera av bokstaven a .*!! ! noll eller flera av vilket tecken som helst a+!! ! ett eller flera av bokstaven a a?!! ! (foo)+!! noll eller ett av bokstaven a en eller flera förekomster av strängen "foo” foo|bar! [ ab ]!! strängen "foo" eller "bar” bokstaven a eller bokstaven b [ a-e ]! någon av bokstäverna a, b, c, d eller e [ ^a ]!! [ -a ]!! något tecken som inte är bokstaven a något av tecknet minus eller bokstaven a ^a!! a$!! bokstaven a först på en rad bokstaven a sist på en rad ! ! a{3}! ! aaa Exempel Perl ! Varför Perl? \.bak$ ! Som jag sa på förra lektionen vi pratade om skripts så kan man visserligen göra en hel del med hjälp av scripts skrivna för sh men tyvärr så blir det ganska bökigt eftersom man måste använda en massa olika program för att få en sak gjord. Det innebär att man måste kunna syntaxen för flera olika program för att det ska fungera ... jobbigt. \.c$|\.h$ [0-9]{6}-[0-9]{4} ! Vad är Perl? ^item[0123456789]*$ ! Perl är ett programmeringsspråk och ett program. Det trevliga med Perl att det innehåller det mesta av funktionaliteten i sed, awk, sh, etc etc, så man behöver bara lära mig en syntax istället för flera. [yY][eE][sS] [^0-9] ^[+-]?(\d+\.\d+|\d+\.|\.\d+|\d+)([eE][+-]?\d+)?$ Variabler ! Det finns flera olika typer av variabler. Typerna bestäms genom ett prefix, tex $, @ och %. ! Skalära variabler ! Detta är vanliga variabler och de kan innehålla olika typer av information. Som prefix så används $. ! Skalära värden kan vara antingen strängar, heltal eller flyttal. Perl kommer automatiskt konvertera mellan de olika typerna. ! Arrayer ! Det finns också arrayer, de använder prefixet @. De fungerar som vanliga arrayer och används som vanliga arrayer. @hello = ("one","two","three"); print @hello; print "\n"; print $hello[2] . "\n"; Variabler forts. ! Hashtabeller (eller associative tabeller) ! En otroligt nyttig datastruktur är hash tabeller (kallades förut 'associativa arrayer' numera är benämningen 'hash'). De användare prefixet %. Exempel: %snutt =("hej","two","three","four","five","six"); printf "Exempel $snutt{'three'}\n"; # Ger utskriften 'Exempel four’ ! Otroligt nyttig datastruktur. Olika 'namespaces’ $hello = "Hej"; @hello = ("one","two","three","four"); %hello = ("five","six","seven","eight"); print $hello;print "\n"; print @hello;print "\n"; print %hello;print "\n"; # Utskriften Speciella variabler ! I Perl finns det ett stort antal speciella variabler, så pass många att man inte kommer ihåg dem om man inte programmerar Perl konstant. Några exempel är: ! $_ ! Default string. Den sträng som används om ingen annan anges ! @ARGV ! En array som innehåller parametrarna till scriptet ! @_ # Hej ! Innehåller parametrarna i ett funktionsanrop ! %ENV # onetwothreefour ! En hashtabell med alla omgivningsvariabler # seveneightfivesix if $xfile = 56; $yfile = 100; if($xfile == $yfile){ print "De är lika\n"; } else { print "De är olika\n"; } ! Resultatet då man kör är:De är olika while $xfile = 90; $yfile = 100; while($yfile > $xfile++) { print "\$yfile = $yfile, \$xfile = $xfile\n"; } ! Detta ger resultatet $yfile = 100, $xfile = 91 $yfile = 100, $xfile = 92 $yfile = 100, $xfile = 93 $yfile = 100, $xfile = 94 $yfile = 100, $xfile = 95 $yfile = 100, $xfile = 96 $yfile = 100, $xfile = 97 $yfile = 100, $xfile = 98 foreach forts. foreach @example = ("one","two","three"); foreach $val ( @example ){ printf "Ord: %s\n", $val; } ! Utskriften blir: Ord: one Ord: two Ord: three $x_f{'d_one'} = 'v_one'; $x_f{'d_two'} = 'v_two'; $x_f{'d_three'} = 'v_three'; print %x_f; print "\n"; foreach $keyval ( keys %x_f ){ printf "Nyckel : $keyval värde : $x_f{$keyval}\n"; } foreach $keyval ( sort (keys %x_f) ){ printf "Nyckel : $keyval värde : $x_f{$keyval}\n"; } d_threev_threed_twov_twod_onev_one Nyckel : d_three värde : v_three Nyckel : d_two värde : v_two Nyckel : d_one värde : v_one Nyckel : d_one värde : v_one Nyckel : d_three Nyckel : d_two värde : v_three värde : v_two Strängar Filer och filehandles ! Det som är lite speciellt med strängar är att man måste använda speciella operatorer för att jämföra dem: ! Filer öppnas mha funktionen open. Jämförelse! Numerisk! Sträng! Returvärde open(OUTFILE, ">output.txt") or die "Can't open output.txt: $!"; Lika! $a == $b! $a eq $b! Sant om $a är lika $b open(LOGFILE, ">>my.log") Olika! $a != $b! $a neq $b! Sant om $a är skilt från $b ! Läsning från filen kan göras mha operatorn "<>" Mindre än! $a < $b! $a lt $b! Sant om $a är mindre än $b my $line Större än! $a > $b! $a gt $b! Sant om $a är större än $b my @lines = <INFILE>; #läser in hela filen Mindre eller lika! $a <= $b! $a le $b! Sant om $a är mindre än ! Efter användning bör filerna stängas ! ! ! eller lika med $b $a >= $b! $a ge $b! Sant om $a är större än eller ! Större eller lika! ! ! ! lika med $b Jämförelse! ! $a <=> $b! $a cmp $b! 0!om de är lika, 1 om $a är ! ! ! större, -1 of $b är större ! open(INFILE, "input.txt") ! vill man söka i en annan sträng än $_ anges detta mha operatorn =~ Ex: $hej = "750510-8550"; if ($hej =~ /([0-9]{6}-[0-9]{4})/) { print "Personnummret var $1\n"; or die "Can't open logfile: $!"; = <INFILE>; #läser in en rad close(INFILE); Sökning ! vi kan söka mha reguljära uttryck genom att innesluta dessa i // or die "Can't open input.txt: $!"; Byta ut delar av strängar ! Görs mha s/// ! Exempel: $string1 = "I love to eat apples all day. I can eat apples every day! Apples are yummy!"; $string1 =~ s/apples/oranges/g; print "The resulting value is : $string1 \n"; } Funktioner ! Man kan deklarara sub-rutiner med hjälp av nyckelordet ''sub” $example = demo_func("en parameter"); printf "Resultat: $example\n"; sub demo_func{ my $test = $_[0]; $test =~ tr/ae/AE/; return $test; } ! Resultatet blir då: Resultat: En pArAmEtEr Funktioner $secondExample = switch_case("lower case and UPPER CASE"); printf "Resultat: $secondExample\n"; sub switch_case{ my $test = $_[0]; $test =~ tr/a-zA-Z/A-Za-z/; return $test; } ! Resultat: Resultat: LOWER CASE AND upper case Mer info ! Om perl ! Prova ”man perl” faktiskt en riktigt bra man-sida (gå sedan vidare till respektive delavsnitt) ! Om perl funktioner ! perldoc -f funktionsnamn ! Och som alltid så kan man alltid kolla... ! www