Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

[Perl] 2x shift van een reference van een hash

Pagina: 1
Acties:

  • Justin_Time
  • Registratie: Juni 2001
  • Laatst online: 17-07 16:29
Hallo,

Ik zit vast met een stukje perl code en ik kom er niet uit.

Ik heb iets ala
code:
1
2
3
4
5
6
7
sub aap {
$noot = shift @_;

print "noot is: $noot->{'mies'}";

}
aap (\%noot);


Dit werkt erg goed ik krijg gewoon netjes het element mies uit de hash noot: maar het probleem komt erbij wanneer ik er een 2e reference bij geef dus iets van:

code:
1
2
3
4
5
6
7
8
9
sub aap {
$noot = shift ;
$wim= shift;

print "noot is: $noot->{'mies'}";
print "wim is: $wim->{'zus'}";

}
aap (\%noot,\%wim);


Het probleem hier is dat mijn code niet compiled ik krijg een vage foutmelding van:
Global symbol "%wim" requires explicit package name.

Dit is niet waar ik declareer ze gewoon netjes met my etc...

Ik dacht aangezien een "reference" maar 1 "item" heeft ik bij de tweede shift mijn 2e reference zal krijgen maar blijkbaar is dit niet waar.
Is dit gewoon niet mogelijk of heb ik ergens iets qua syntax verkeerd zitten?

[ Voor 11% gewijzigd door Justin_Time op 27-10-2008 21:26 ]

Elke dag dronken is ook een geregeld leven.


  • urk_forever
  • Registratie: Juni 2001
  • Laatst online: 14-11 22:24
Ik ben geen Perl expert, maar in het eerste code voorbeeld heb je $noot = shift @_; staan en in het tweede heb je alleen $noot = shift; staan. Klopt dat wel?

Hail to the king baby!


  • silentsnake
  • Registratie: September 2003
  • Laatst online: 14:27
Dat klopt, met een @_ pak je dus alle argumenten in 1 keer naar je scalar. Wat jij wilt is $_[0] en $_[1] gebruiken om op die manier de twee hashes in een scalar te zetten binnen je subroutine. Ik weet niet eens of het zo werkt; ik gebruik eigenlijk zelden hashes of hash arrays.

Als je per see hashes wilt gebruiken dan zou dat moeten kunnen, maar als je gewone scalars of arrays gebruikt werkt de methode die ik daarboven heb beschreven wel; dat gebruik ik heel vaak.

[ Voor 25% gewijzigd door silentsnake op 27-10-2008 22:32 ]


  • veldsla
  • Registratie: April 2000
  • Laatst online: 14-11 14:32
Je voorbeeld is niet helemaal goed. Je schrijft dat je alles met my declareert, maar ik zie het niet.

Je kan gewoon references van @_ shiften. Ook hashrefs. Je code zou dus gewoon moeten werken. Heb je misschien %wim als ref gedeclareerd met $wim = {zus=>10}; ? Dat geeft zo'n error als je dan later %wim gebruikt.

Werk in ieder geval met use strict en use warnings. Altijd.

Dit wil je denk ik en deze code werkt:
Perl:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
use strict;
use warnings;

sub aap {
    my $aap = shift;
    my $noot = shift;

    print "aap=$aap->{'mies'}\n";
    print "noot=$noot->{'mies'}\n";
}

my %a = (mies=>10);
my %b = (mies=>10);

aap(\%a, \%b);