ReferencesJan takke wat is het heet!!!
*naar koud biertje kijkt*
![]()
... Ik overleef het wel
![]()
References... wat zijn references ? ... zoals mij ooit verteld is: REFERENCES ZIJN GEEN POINTERS... bullshit, zijn misschien geen pointers, maar je kan ze wel gebruiken als pointers...
Een reference is een scalar welke wijst naar een Perl variabele, zo kan je een reference hebben naar een list, een hash, en ja, ook een scalar (alhoewel je dat laatste niet snel zal gebruiken).
Hoe krijg je een reference naar een list ? heel eenvoudig, je zet er een \ voor.
Ik zal even laten zien hoe dat er uit ziet:
--
#!/usr/bin/perl -w
use strict;
my @Array=(1..10);
# Creeer een reference naar de Array:
my $ArrayRef=\@Array;
#En hoe ziet die reference er dan uit ? :
print "Reference naar de array: $ArrayRef\n";
# En voor een hash:
my %Hash=('appel','groen','banaan','geel');
my $HashRef=\%Hash;
print "Reference naar de hash: $HashRef\n";---
En wat zien we dan ? (Zier er bij jullie waarschijnlijk iets anders uit) :
choas:~ choas$ ./les10
Reference naar de array: ARRAY(0x80a264)
Reference naar de hash: HASH(0x80cacc)
choas:~ choas$ Nou zijn er meerdere redenen om een reference te gebruiken, in dit deel zal ik uitleggen waarom ze handig zijn wanneer je informatie naar een subroutine wil passen, en in het volgende deel zal ik wat uitleggen over complexe data structuren.
Maar eerst dus subroutines... we hebben gezien dat data naar een subroutine als array wordt aangeleverd... het volgende probleem ontstaat:
---
#!/usr/bin/perl -w
use strict;
sub PrintArray
{
# HIER is het probleem... allebei de arrays zitten in @_, HOE weten we nou
# waar de eerste eindigt, en de 2e begint ?
print "AtUnderscore: @_\n";
};
my @Array1=(1..4);
my @Array2=(5..10);
PrintArray @Array1, @Array2;---
Output:
choas:~ choas$ ./les10
AtUnderscore: 1 2 3 4 5 6 7 8 9 10
choas:~ choas$ Dat sucked dus... zwaar zelfs... De oplossing voor dit probleem is dus gebruikmaken van references, in plaats van de arrays zelf geven we een reference naar de arrays door aan de functie (dit heeft nog veel meer resource voordelen, maar daar gaan we het niet over hebben).
Gaan we:
---
#!/usr/bin/perl -w
use strict;
sub PrintArray
{
# hebben we de references ?
print "AtUnderscore: @_\n";
};
my @Array1=(1..4);
my @Array2=(5..10);
PrintArray \@Array1, \@Array2;
----
Output:
choas:~ choas$ ./les10
AtUnderscore: ARRAY(0x80ffb4) ARRAY(0x80ca90)
choas:~ choas$ Nou, mooi zo, de references naar de arrays zijn inderdaad in de functie aangekomen, maar hoe de fuck krijgen we daar uit nou weer de originele arrays terug ?
Antwoord: de-refereren
![]()
Voor een array als volgt:
@{$ArrayRef};
Voor een hash:
%{$HashRef};
Kijken of dit werkt ?
---
#!/usr/bin/perl -w
use strict;
sub PrintArray
{
print "AtUnderscore: @_\n";
# Haal de references uit @_
my $Ref1=shift;
my $Ref2=shift;
# de-reference weer naar lists:
my @Arr1=@{$Ref1};
my @Arr2=@{$Ref2};
# Heeft het gewerkt ? :
print "Array 1: @Arr1\n";
print "Array 2: @Arr2\n";
};
my @Array1=(1..4);
my @Array2=(5..10);
PrintArray \@Array1, \@Array2;
---
Output:
choas:~ choas$ ./les10
AtUnderscore: ARRAY(0x80a324) ARRAY(0x80cbb0)
Array 1: 1 2 3 4
Array 2: 5 6 7 8 9 10
choas:~ choas$ En DAT is dus een van de voordelen van references... Hopelijk is dit duidelijk, we gaan dit veel gebruiken.
Bij vragen: Laat het me alsjeblieft weten.
Straks denk ik deel 2 van references: complexe data structuren... wanneer er daarna nog geen vragen zijn is er een van de volgende dingen aan de hand:
Iedereen snapt het zonder enig probleem
Niemand leest dit
Iedereen die dit leest denkt het te snappen
Nobody gives a fuck
![]()
Ik hoop dat jullie het nog leuk vinden... ![]()
Weet IEMAND trouwens hoeveel van die klote dingen ik nog moet tikken voor ik in dat fucking schouderklopjestopic kom ?