/ Forside / Teknologi / Udvikling / Perl / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Perl
#NavnPoint
bjarneA 141
poul_from 50
soccer 30
Nicknack 14
Tmpj 0
Array of Hashes i for loop ?
Fra : Erik Holst Trans


Dato : 25-11-03 22:11

Hej,

Er der en der kan give et hint om hvad jeg gør forkert i nedenstående
kode stump.

//--snip--//

#!/usr/bin/perl


my @groups = qw (g1 g2 g3);
my @array;
my %group;

for $entry (@groups) {
$group->{"a"} = "a-$entry";
$group->{"b"} = "b-$entry";
push (@array, $group);
}
my $info = $array[0];
my $info1 = $array[1];
my $info2 = $array[2];

print "[0] " . $info->{a} . "\n";
print "[0] " . $info->{b} . "\n";

print "[1] " . $info1->{a} . "\n";
print "[1] " . $info1->{b} . "\n";

print "[2] " . $info2->{a} . "\n";
print "[2] " . $info2->{b} . "\n";

//--snip--//


Når koden eksekvers havde jeg forventet et output på skærmen som svarre
til følgende:

[0] a-g1
[0] b-g1
[1] a-g2
[1] b-g2
[2] a-g3
[2] b-g3


Men i praksis får jeg følgende:

[0] a-g3
[0] b-g3
[1] a-g3
[1] b-g3
[2] a-g3
[2] b-g3


Som det ses får alle hash felterne tilskevet den sidste værdi som
for-loop'en gennem løbes med.. alstå g3.



Med venlig hilsen
Erik Holst Trans


 
 
Lasse Hillerøe Peter~ (25-11-2003)
Kommentar
Fra : Lasse Hillerøe Peter~


Dato : 25-11-03 22:44

In article <3fc3c410$0$95024$edfadb0f@dread11.news.tele.dk>,
Erik Holst Trans <eht@it-trans.dk> wrote:

> Hej,
>
> Er der en der kan give et hint om hvad jeg gør forkert i nedenstående
> kode stump.
>
> //--snip--//
>
> #!/usr/bin/perl

Du mangler -w her.

>
>
> my @groups = qw (g1 g2 g3);
> my @array;
> my %group;
>
> for $entry (@groups) {
> $group->{"a"} = "a-$entry";

$group er en skalar, som du bruger som en reference. Den bliver lavet
automatish een gang, og så pusher du ellers den samme reference mange
gange, mens du ændrer felternes værdier, så de ender med at være ens i
udskriften.

Du kan enten starte med at assigne den en reference til en tom hash:
$group = { };

Eller du kan bruge (og genbruge) din allerede erklærede hash, ved at
fjerne "->"
> $group->{"b"} = "b-$entry";
$group{"b"} = "b-$entry";

> push (@array, $group);
og så pushe en reference til en anonym *kopi* af din hash:
push(@array, { %group } );

Du kunne selvfølgelig også bare pushe en reference til en anonym hash:

push( @array, { a => "a-$entry", b => "b-$entry });

> }

-Lasse

Erik Holst Trans (26-11-2003)
Kommentar
Fra : Erik Holst Trans


Dato : 26-11-03 10:38

Hej Lasse,

Det fungere perfekt nu...

Tak for hjælpen.

//Erik


Lasse Hillerøe Petersen wrote:
> In article <3fc3c410$0$95024$edfadb0f@dread11.news.tele.dk>,
> Erik Holst Trans <eht@it-trans.dk> wrote:
>
>
>>Hej,
>>
>>Er der en der kan give et hint om hvad jeg gør forkert i nedenstående
>>kode stump.
>>
>>//--snip--//
>>
>>#!/usr/bin/perl
>
>
> Du mangler -w her.
>
>
>>
>> my @groups = qw (g1 g2 g3);
>> my @array;
>> my %group;
>>
>> for $entry (@groups) {
>> $group->{"a"} = "a-$entry";
>
>
> $group er en skalar, som du bruger som en reference. Den bliver lavet
> automatish een gang, og så pusher du ellers den samme reference mange
> gange, mens du ændrer felternes værdier, så de ender med at være ens i
> udskriften.
>
> Du kan enten starte med at assigne den en reference til en tom hash:
> $group = { };
>
> Eller du kan bruge (og genbruge) din allerede erklærede hash, ved at
> fjerne "->"
>
>> $group->{"b"} = "b-$entry";
>
> $group{"b"} = "b-$entry";
>
>
>> push (@array, $group);
>
> og så pushe en reference til en anonym *kopi* af din hash:
> push(@array, { %group } );
>
> Du kunne selvfølgelig også bare pushe en reference til en anonym hash:
>
> push( @array, { a => "a-$entry", b => "b-$entry });
>
>
>> }
>
>
> -Lasse


Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408929
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste