In dit document: Random nuttige informatie, reeks 1, reeks 2, reeks 3, regex overzicht, overzicht speciale
variabelen (zoals $/). De oplossingen van de oefeningen zijn vaak aangevuld met extra uitleg/commentaar
Beperkte lijst van interessante functies (volgens de prof):
scalaire functies: chomp, chr, hex, index, lc, length, oct, ord, reverse, rindex, sprintf, substr, uc, split
numerieke functies: rand, srand
array functies: pop, push, shift, splice, unshift
list functies: grep, join, map, reverse, sort
hash functies: delete, each, exists, keys, values
I/O functies: close, die, eof, open, print, printf
varia: defined, eval, local, my, scalar, undef
functies voor datum en tijd: localtime, time
Naam
Uitleg en praktisch nut
functie
Scalaire functies
bij het inlezen van een bestand de enters op elke lijn weghalen.
chomp
Bv. while(<DATA>){ chomp; … }
chr chr geeft character bij nummer, bv. chr(65) = “A”
ord ord geeft nummer bij character, bv. ord(‘A’) = 65
hex interpreteert als hex-string en geeft numerieke waarde. Bv. hex ‘aF’ 175
interpreteert als octaal-string en geeft numerieke waarde. Bv. oct(31) = 25
oct
(behalve indien voorafgegaan door 0x (hex) of 0b (binair), dan die interpretatie)
index STR,SUBSTR[,POS]
index Zoekt in een string naar substring, vanaf “POS”.
Returnt de 1ste index of -1 indien niet gevonden.
Werkt zoals index, maar nu wordt de laatste positie teruggegeven ipv de eerste.
rindex
(met POS de bovengrens om te zoeken)
lc en uc Lowercase en uppercase: Bv. uc(TeSt) TEST
length geeft lengte van expressie Bv. length($string) 5
List context: returns elements of list in reverse order.
reverse
Scalar context: returns concatenated string of values. Bv. return reverse(“Hello”) -> olleH
sprintf Zie printf, maar dan wordt het gereturned ipv geprint. Bv. $text = sprintf("%0d \n", 9);
returns a substring of EXPR, starting at OFFSET within the string. Bv. substr(“okay”,2) “ay”
substr
substr EXPR, OFFSET, LEN, REPLACEMENT
split String splitten op bepaald pattern, bv. @a = split(“;”,$string); of @f = split(/:/, "1:2:3:4:5");
Numerieke functies
rand Geeft random kommagetal tussen 0 en argument, of 1 indien geen argument. Bv. rand(5)
srand sets the seed value for rand(), dus eerst srand() oproepen voor je rand() oproept.
Array functies (zie ook vraag 1.22)
pop Pops and returns the last value of the array, shortening the array by one element.
push used to push a list of values onto the end of the array. Syntax: push(Array,list).
Shifts the first value of the array off and returns it, shortening the array by 1 and moving
shift
everything down.
splice ARRAY,OFFSET,LENGTH,LIST. Removes the elements designated by OFFSET and
splice
LENGTH from an array, and replaces them with the elements of LIST, if any.
unshift <-> shift: Voegt vooraan toe aan array. Bv. unshift(@a, 70, 'Geeks'); 70 Geeks @a
1
, List functies
A filter that runs a regular expression on each element of an array and returns only the
grep
elements that evaluate as true. Bv. @grepNames = grep(/^A/, @myNames);
Joins the strings of LIST into a single string with fields separated by the value of EXPR.
join
Bv. my $rec = join(':', $login,$passwd,$uid,$gid,$gcos,$home,$shell);
Array transformeren. Bv. my @doubles = map {$_ * 2} @numbers;
map
Of hash van maken: my %is_invited = map {$_ => 1} @names;
List context: print join(", ", reverse "world", "Hello"); # Hello, world
reverse
Scalar context: print scalar reverse "dlrow ,", "olleH"; # Hello, world
sort (zie 1.36) Bv. my @eldest = sort { $age{$b} <=> $age{$a} } keys %age;
Hash functies
Verwijdert element van hash -> exists geeft geen true.
delete
Bv. my $scalar = delete $hash{foo};
each Bv. while (my ($key, $value) = each %hash) { … }
True als element bestaat (mag ook undefined zijn)
exists
Bv. print "Exists\n" if exists $hash{$key};
keys Geeft alle keys van hash. Bv. my @keys = keys %ENV;
values Geeft alle values van hash. Bv. my @vals = values %ENV;
I/O functies
close Enkel nodig als je line counter $. wilt resetten. (Bij openen closet hij automatisch eerst)
die Exceptie opwerpen. Bv. open(INPUT, 'foo') or die "Can't open 'foo' for input: $!";
eof returns 1 if the next read on FILEHANDLE will return end of file or if FILEHANDLE is not open
open File openen: bv. open(FH, '<', 'c:\temp\test.txt'); of open($fh, “iets.txt);
print Simpele printfunctie… Bv. print “Hello $world”;
printf Met format, bv. printf “This is question %d on %s”, 3215, ‘Stackoverflow’;
Varia
defined Als het niet undefined is. Bv. print "Defined\n" if defined $hash{$key};
Evalueert klein stukje perl ofzo
eval Bv. # make divide-by-zero nonfatal
eval { $answer = $a / $b; }; warn $@ if $@;
local Internet zegt: zet gewoon my voor uw variabele en gebruik local niet
A my declares the listed variables to be local (lexically) to the enclosing block, file, or eval.
my
(Niet gebruikt bij de oplossingen van labo, niet nodig)
Forces EXPR to be interpreted in scalar context and returns the value of EXPR.
scalar
Bv. scalar(@array) geeft lengte van array
undef Undefines the value of EXPR, which must be an lvalue. Returns undefined value.
Datum en tijd
localtime Bv. my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
time Geeft aantal seconden sinds … terug, wordt gebruikt om o.a. localtime te feeden.
2
,Andere random informatie:
Scalaire variabelen voorafgegaan door $
Boolean bestaat niet. True als getal niet 0 is. String is True als hij niet leeg is.
Strings niet vergelijken met ==, wel met eq: if($x eq $y){ … } (bij bash juist omgekeerd!!!)
omgekeerde van eq is ne (not equals)
In for-loop is $_ huidige variabele:
$. Geeft het aantal lijnen gelezen
Afronden gebeurt op veelvouden van 2: -1.5 -2 ; -2.5 -2 ; 3.5 4 ; 4.5 4
$^I=”.bak”; opent read-write mode: print() schrijft naar bestand: rechtstreeks aanpassen
Omgekeerd printen:
for(reverse 0..scalar@T){ print $T[$_]; }
Bij splice in reverse aflopen:
for(reverse 0..scalar@T){ splice @T,$_,1; )
Grep:
@T = grep {$_=~/God/} @T; # na grep komt het predicaat tussen {}
@T = grep {/God/} @T; # is zelfde
Cascade: @T = grep {…} grep {/God/} @T; #lezen van rechts naar links
$#ARRAY is laatste geldige index, @ARRAY in scalaire context is aantal elementen.
$#ARRAY-- verkleint de grootte van de array met 1.
Element vooraan array verwijderen en achteraan bijzetten:
push @processes, ($process = shift @processes);
3
,Next, redo en last binnen een loop:
Examen: bv. Puzzel met data uit html-bestand halen -> met reguliere expressies beschrijven
welk stukje je wilt -> die taggen en als returncode in tabel krijgen of zo
!!! lijn 7 en 9 doen hetzelfde:
!!! Bij het sorteren met een 2de voorwaarde moet je met or werken ipv || :
Telkens je in Perl met reguliere expressies wil werken moet je je 4 vragen stellen:
1. Lijn of slurpmode? Met andere woorden: undef $/ niet of wel?
2. Split gebruiken om met reguliere expressies delimeters te beschrijven? Of Reguliere
expressies via de m (matching) operator, de waardevolle informatie eruit halen? (Ik denk
vaker de 2de optie.)
3. Progressief of traditioneel (al dan niet met de g modifier)?
4. Scalaire of lijstcontext?
4
, Reeks 1
1. Hoe kun je een variabele instellen met een default waarde, enkel op voorwaarde dat die variabele op
dat ogenblik geen waarde heeft ?
$x = 0;
$x ||= "default"; #maar als $x een waarde bevatte bleef hij die waarde behouden
(ter info:)
2. Hoe kun je de inhoud van twee of meer variabelen cyclisch omwisselen, zonder een intermediaire
variabele te gebruiken ?
3. Geef de (numerieke) ascii-waarde weer van een willekeurig karakter. Geef de karakterrepresentatie
weer van een willekeurige numerieke ascii-waarde.
print chr(65);
print ord('A');
4. Bepaal de inverse van een willekeurige, uit woorden samengestelde string:
enerzijds door de individuele karakters van elk woord in omgekeerde zin af te lopen (om
bijvoorbeeld palindromen te herkennen)
anderzijds door de woorden in omgekeerde zin af te lopen, maar de volgorde van de karakters
per woord te behouden.
5. Converteer een willekeurige string in uppercase of lowercase.
uc(“Hello World”); en lc(“Hello World”);
(ter info:)
5