Avatar billede tued Nybegynder
27. april 2005 - 10:08 Der er 13 kommentarer

Hlæp til udprinting af array elementer gemt i en hash

Hej

Har følgende kode:

$todo_value_tags[0]            = $row->{'flow_name'};
$todo_value_tags[1]            = $row->{'orders'};
$todo_values{$row->{'name'}}     = @todo_value_tags;
$todos{'values'}        = \%todo_values;



Mit spørgsmål er så hvordan jeg kan få printet $todo_value_tags[0] ???
Synes at jeg har prøvet alt, men det har jeg jo sikkert ikke.

Jeg kan ikke bruge en reference til arrayet da det løbende bliver clearet...
Avatar billede mfalck Praktikant
27. april 2005 - 10:13 #1
det nemmeste plejer at være at bruge Data::Dumper til at skrive hash-værdier ud
Avatar billede tued Nybegynder
27. april 2005 - 10:15 #2
det er også ok, men jeg skal kun bruge et enkelt element i arrayet ad gangen.
Avatar billede mfalck Praktikant
27. april 2005 - 10:19 #3
ok - jeg troede du mente at du ville debugge koden. Kan du kort beskrive hvad det er du forsøger at gøre - jeg kan næsten forstå at du vil have noget ud af $todos (hashen) ?
Avatar billede mfalck Praktikant
27. april 2005 - 10:22 #4
det må være noget i stil med

my $ref_todo_val = $todos{'values'} ;
my $todo_val = $$ref_todo_val;

Her står du så med en hash som indeholder et array så du skal enten løben hashen igennem et element ad gangen og tage arrayet ud og skrive værdierne ud eller også skal du henvise til elementet direkte (hvis du kender navnet)
Avatar billede tued Nybegynder
27. april 2005 - 10:24 #5
De værdier der bliver lagt i $todo_value_tags arrayet vil jeg gerne have skrevet ud på skærmen enkeltvis.

Grunden til at jeg lægger det hele ned i en enkelt hash er at jeg skal overføre samtlige parametre som et argument eller rettere en return.

Når jeg modtager hashen lægger jeg $todos{'values'} over i en scalar. Jeg vil så bruge denne scalar til at udskrive de enkelte elementer i arrayet.
Avatar billede mfalck Praktikant
27. april 2005 - 10:25 #6
hvis du vil løbe hashen igennem så er det noget i stil med

my @ary;
my $elem;
foreach $elem (keys %todo_val) {
  $ary = $elem;
  print "$ary[0] - $ary[1]\n";
}

PS: bemærk at jeg har skrevet koden her så der er ikke foretaget syntaks tjek :-)
Avatar billede tued Nybegynder
27. april 2005 - 10:51 #7
Ok det har er altså lidt mærkeligt.
Nu har jeg fået den til at skrive indholdet af de to elemeter i arrayet ud, men det ser ud som om det første element kun indeholder array størrelsen og det andet element er tom.
Jeg har udskrevet todo_value_tags arrayet før det bliver lagt ned i hash, her er værdierne i arrayet som de skal være.

Har du nogen idé til hvad der er gået galt..???
Avatar billede mfalck Praktikant
27. april 2005 - 10:55 #8
hmm .. nu er det længe siden jeg har leget med Perl i denne henseende - jeg har to forslag som jeg dog ikke lige kan se om de virker korrekt:
1) istedet for at bruge
$todo_values{$row->{'name'}}    = @todo_value_tags;
skal du måske skrive:
$todo_values{$row->{'name'}}    = $todo_value_tags;

måske skulle du lægge en reference til arrayet ind:
$todo_values{$row->{'name'}}    = \@todo_value_tags;
Avatar billede mfalck Praktikant
27. april 2005 - 10:55 #9
hov - den sidste var nr 2 :-)
Avatar billede tued Nybegynder
27. april 2005 - 11:01 #10
har prøvet har bruge en reference til arrayet, men der er bare lige det problem at arrayet bliver opdatere mange gange før det bliver lagt ned i hashen.
Det resultere i at elementerne i alle de arrays der er i hashen har den samme værdi og der er jo ikke så godt.
Avatar billede mfalck Praktikant
27. april 2005 - 11:16 #11
#!/usr/bin/perl
use strict;

my @todo_value_tags;
my (%todo_values, %todos);

$todo_value_tags[0] = "0";
$todo_value_tags[1] = "1";
$todo_values{'name'}    = \@todo_value_tags;
$todos{'values'}        = \%todo_values;


my $ref_todo_val = $todos{'values'} ;
my %todo_val = %$ref_todo_val;

my @ary;
my ($key, $value);
my %tmp;
while(($key, $value) = each(%todo_val)) {
  # do something with $key and $value
#  print "$key - $value \n";

    @ary = @$value;
    print "$ary[0] - $ary[1]\n";
  }

skriver:
0 - 1

Du kan evt bare initialisere arrayet for hver iteration, så vil du få en ny reference
Avatar billede mfalck Praktikant
27. april 2005 - 11:17 #12
altså have:
my @todo_value_tags;
i dit loop.
Avatar billede tued Nybegynder
27. april 2005 - 12:39 #13
Så har jeg fået løst problemet.

$todo_values{$row->{'name'}}    = [@todo_value_tags];

Så arbejder vi på reference igen og det kan vi godt li'
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester