|
| 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
| |
|
|