Simpel Perl og regulære udtryk

perl

Navnet Perl er en forkortelse af "Practical Extraction and Report Language" som fortæller noget om hvad Perl er rigtig god til nemlig tekstmanipulation. Med Perl er det let at hente bestemte informationer ud fra f.eks. en tekstfil.

For at komme i gang starter jeg med det klassiske "Hello World!" script / program. Indsæt
de følgende linier i et tekstdokument (eks.pl) og kør det med kommandoen:
$ perl eks1.pl

// --eks1.pl-------------------
#! /usr/bin/perl
print "Hello World!\n";
// ----------------------------

Du kan også gøre filen eksekverbar med denne kommando:
$ chmod +x eks1.pl
hvorefter det køres med
$ ./eks1.pl

I det næste eksempel skal vi først gemme en stump tekst i en variabel, for derefter at
udskrive tekststumpen sammen med noget andet tekst.

// --eks2.pl-------------------
#! /usr/bin/perl
my $tekst = "En tekststreng.";
my $tal = 3.14;
print "Indholdet af \$tekst er: $tekst\n";
print "Indholdet af \$tal er: $tal\n";
// ----------------------------

Når du kører programmet skulle det gerne skrive dette til skærmen.
Indholdet af $var er: En tekststreng.
For at skrive specialtegnet $ har jeg escapet det i print sætningen (\$), det gøres for at
Perl ikke skal indsætte værdien af $var i strengen som den gør lidt senere.

I Perl kan man også sætte betingelser for om en bestemt stump kode skal afvikles, det gøre
vha. af en if sætning, der er opbygget på denne måde:
if(betingelse){gør noget}
hvor betingelse kan være hvadsomhelst, f.eks. 2 > 1 (sandt), 1 > 2 (falsk), 4 == 3 (falsk),
4 != 3 (sandt). I stedet for at have faste værdier i betingelsen benytter man næsten altid
værdier gemt i variabler. Hvis man ønsker at gøre noget hvis betingelsen er opfyldt og
noget andet hvis det ikke er tilfældet benytter man if-else strukturen, der er vist i
eksempel 3.

// --eks3.pl-------------------
#! /usr/bin/perl
my $number = 4;

if($number < 4)
{
print "Betingelse opfyldt!\n";
}
else
{
print "Betingelse ikke opfyldt!\n";
}
// ----------------------------

Det der gør Perl virkelig stærkt er de regulære udtryk. Med regulære udtryk er man i stand
til afgøre om en streng opfylder bestemte betingelser (findes der tal i udtrykket ...) og
evt. at opdele en tekststreng efter dens egenskaber.

// --eks4.pl-------------------
#! /usr/bin/perl
my $streng = "123";

if($streng =~ /^[0-9]+$/)
{
print "Der er kun tal i \$streng: $streng\n";
}

if($streng =~ /^[a-zæøåA-ZÆØÅ]+$/)
{
print "Der er kun bogstaver i \$streng: $streng\n";
}
// ----------------------------

I eksemplet er betingelserne i if sætningerne regulære udtryk. Betingelsen
$streng =~ /^[0-9]+$/
er opfyldt hvis indholdet af $streng opfylder det efterfølgende udtryk (forklaret herefter)

/ # regexp starter
^ # matcher linie begynd
[0-9] # matcher et tegn i intervallet fra 0 til 9
+ # gør at matchen fra forrige linie gentages et vilkårligt antal gange
$ # matcher linie slut
/ # regexp slut

Er det svært at gennemskue hvordan det regulære udtryk er konstrueret kan programmet
txt2regex (http://txt2regex.sourceforge.net/) anbefales. Den stiller en række spørgsmål og ud fra dine
svar opbygger programmet så et regulært udtryk der matcher det ønskede.

// --eks5.pl-------------------
#! /usr/bin/perl
my $var = "En tekststreng der 42 indeholder et tal.";

if($var =~ /^([^0-9]*)([0-9]+)(.*)/)
{
print "Strengen inden tallet: $1\n";
print "Tallet: $2\n";
print "Strengen efter tallet: $3\n";
}
else
{
print "Strengen indeholder ikke et tal: $var\n";
}
// ----------------------------

Jeg tror eksemplet kræver en god forklaring. Kernen i eksemplet er betingelsen:
$var =~ /regexp/
der afprøver det regulære udtryk regexp på indholdet af $var. Hvis det regulære udtryk er
opfyldt har udtrykket værdien sand og if-betingelsen er opfyldt.

Opbygningen af det regulære udtryk i eksemplet er her beskrevet.
/ # regexp starter
^ # matcher begyndelsen af en linie
([^0-9]*) # matcher et vilkårligt antal tegn der ikke er tal, det der matches gemmes i variablen $1
([0-9]+) # matcher en gruppe af tal, dog med mindst et taltegn --> $2
(.*) # matcher resten af strengen --> $3
/ # regexp slut

Jeg håber det er nok til at komme i gang med lidt Perl scipting. Hvis det har fanget
din interesse er der herunder flere kilder til information om Perl og lidt om regulære
udtryk.

# Man-sider omhandlende Perl og regulære udtryk i Perl (engelsk)
man perl
man perlintro
man perlrequick
man perlretut
man perlre

# Regulære udtryk (regex) og globbing - kapitel i "Friheden til at vælge ..." bøgerne (dansk)
http://www.linuxbog.dk/alle/bog/regexp.html