Schrift
[thread]6756[/thread]

Array of hashs

Leser: 2


<< |< 1 2 3 >| >> 21 Einträge, 3 Seiten
roli
 2005-03-02 23:06
#52248 #52248
User since
2004-12-31
424 Artikel
BenutzerIn
[default_avatar]
Hi,

ich bin (im Moment) daran gescheitert ein Array das aus Hashs besteht auszugeben. Mein Array sieht wie folgt aus:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
JobNo: 1
 input_typ => Integer
 input_comment => Hier bitte einen Integer eingeben
 comment => Dies ist ein Kommentar
 job_template => show_dir
 input_name => Variablenname
 job_name => Directory anzeigen

JobNo: 2
 job_template => show_time
 job_name => Serverzeit anzeigen

JobNo: 3
 job_template => show_server_info
 job_name => Info's über den Server anzeigen

JobNo: 4
 job_template => print_const_str
 job_name => Konstanten String ausgeben

JobNo ist der array index.
Meine Subroutine sieht wie folgt aus:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
sub print_array_with_inner_hash
{
print "Subroutine print_array_with_inner_hash\n";
 my @array2print = @_;
 my $result;
 my $field;
 
 foreach $ref_zeile (@array2print)
 {
   print "Zeile: $ref_zeile()";
   foreach $key (keys %$ref_zeile)
   {
print "Inner hash\n";
     if(defined $ref_zeile{$key})
     {
       print "  $key => $ref_zeile{$key}\n";
     }
   }
   print "\n";
 }
}

Wenn ich "print_array_with_inner_hash(@jobconf);" aufrufe, erhalte ich folgenden Output:
Code: (dl )
1
2
3
4
5
6
Subroutine print_array_with_inner_hash
Zeile: ()
Zeile: 5/8()
Zeile: 5/8()
Zeile: 5/8()
Zeile: 5/8()


Da alles googeln nicht geholfen hat, hoffe ich jetzt auf euch.

Schon mal Danke

Roland
Roland
--
"Steh vorn, während du fragst;
sitzen soll, wer antwortet."
Aus "Die Edda des Snorri Sturluson" "Gylfis Täuschung" Strophe 2
Relais
 2005-03-02 23:51
#52249 #52249
User since
2003-08-06
2244 Artikel
ModeratorIn
[Homepage] [default_avatar]
Aus $ref_zeile{$key}
mache $ref_zeile->{$key}
Erst denken, dann posten --
26. Deutscher Perl- u. Raku -Workshop 15. bis 17.04.2024 in Frankfurt/M.

Winter is Coming
Crian
 2005-03-03 13:03
#52250 #52250
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Außerdem würde ich dazu raten, bei einer Funktion die das AoH nur ausgeben will, das selbige nicht als Kopie, sondern als Referenz zu übergeben.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
roli
 2005-03-03 14:54
#52251 #52251
User since
2004-12-31
424 Artikel
BenutzerIn
[default_avatar]
Hi Relais,

wenn ich dich richtig verstehe, soll ich
Code: (dl )
1
2
3
4
5
6
7
8
   foreach $key (keys %$ref_zeile)
   {
print "Inner hash\n";
     if(defined $ref_zeile->{$key})
     {
       print "  $key => $ref_zeile->{$key}\n";
     }
   }

verwenden, oder?
Koenntest du mir auch erklaehren was du denk'st das dann besser sein soll? Ich versteh's halt nicht (ich bin Perl Newbee). Da man aber dumm sein darf, solange man sich zu helfen weiss (wurde mir immer gesagt), hatte ich die Zeile print "Inner hash\n"; in meinen Sourcecode eingebaut. Diesen Output sehe ich aber nirgends, wie in meinen erste Posting zu sehen ist, ergo die innere Schleife "wird nie betreten", folglich kann eine Aenderung hier nichts bringen.

Danke

Roland
Roland
--
"Steh vorn, während du fragst;
sitzen soll, wer antwortet."
Aus "Die Edda des Snorri Sturluson" "Gylfis Täuschung" Strophe 2
renee
 2005-03-03 15:37
#52252 #52252
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Dann zeig doch mal, wie Du die Subroutine aufrufst... Und vielleicht noch ein paar mehr Code-Zeilen dazu!
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
roli
 2005-03-03 15:52
#52253 #52253
User since
2004-12-31
424 Artikel
BenutzerIn
[default_avatar]
Hi,

kein Thema, hier der Aufruf:
Code: (dl )
print_array_with_inner_hash(@jobconf);


Und hier die Stelle an der mein AoH erstelle:
Code: (dl )
1
2
3
4
5
6
7
8
9
$current_job{'job_name'}      = $job_name;
$current_job{'job_template'}  = $job_template;
$current_job{'comment'}       = $comment;
$current_job{'input_name'}    = $input_name;
$current_job{'input_typ'}     = $input_typ;
$current_job{'input_comment'} = $input_comment;

$jobconf["$job_no"]=\%current_job;
undef %current_job;


Ich parse (na ja, ich versuch's halt) eine Konfigurationsdatei (Zeilenweise), weise die einzelnen Bestandteile der Datei meinen Variablen zu, daraus mache ich 'nen Hash, und den packe ich dann in ein Array, wie oben zu sehen ist. Um keine altlasten fuer Zeile 2 und folgende zu haben schicke ich zuvor den Hash in die ewigen Jagdgruende.

Schon mal Danke

Roland

P.S.: $job_no ist numerisch, >=1, und eindeutig
Alle anderen Variablen enthalten Strings
Roland
--
"Steh vorn, während du fragst;
sitzen soll, wer antwortet."
Aus "Die Edda des Snorri Sturluson" "Gylfis Täuschung" Strophe 2
renee
 2005-03-03 15:58
#52254 #52254
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Mit dem undef %current_job löscht Du den Inhalt Hash wieder! Dann hast Du auch keine keys mehr, über die Du in der foreach-Schleife iterieren kannst!

lass also das undef... weg.

oder mach
Code: (dl )
1
2
$array[$job_no] = {%current_job}; # lass hier auch die " beim Array weg
undef %current_job;
\n\n

<!--EDIT|renee|1109858412-->
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
roli
 2005-03-03 16:09
#52255 #52255
User since
2004-12-31
424 Artikel
BenutzerIn
[default_avatar]
Jeppy,

tausend Dank, die geschweiften Klammern bei der Zuweisung des Hash's auf mein Array haben's gebracht, also:
Code: (dl )
$jobconf[$job_no]={%current_job};


"Nu geit dat"

Roland

<edit>
Koenntest du mir auch "mit ein paar duerren Worten" erklaehren was die Teile machen? Sie haben mich doch recht lange beschaeftigt.
</edit>\n\n

<!--EDIT|roli|1109859171-->
Roland
--
"Steh vorn, während du fragst;
sitzen soll, wer antwortet."
Aus "Die Edda des Snorri Sturluson" "Gylfis Täuschung" Strophe 2
Crian
 2005-03-03 17:29
#52256 #52256
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Ich find Data::Dumper sehr hilfreich, wenn man nicht genau weiß, was in einer Struktur drin ist bzw. wenn man sich vergewissern möchte, dass das drin ist was man meint hineingetan zu haben.

Einfach

Code: (dl )
1
2
3
use Data::Dumper;
...
print Dumper \@struktur;


Dann siehst Du meistens sofort, woran es hapert, es sei denn die Struktur ist sehr groß.



Dürre Worte:

\%hash ist eine Referenz auf ein Hash
{ %hash } ist eine Referenz auf ein anonymes Hash mit einer (flachen) Kopie des Originalhashes.

(btw., falls man tiefe kopien braucht, nehme man Storable::dclone)\n\n

<!--EDIT|Crian|1109863976-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Crian
 2005-03-03 17:40
#52257 #52257
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Hier ein Beispiel zur Verdeutlichung:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/perl
use strict;
use warnings;

use Data::Dumper; $Data::Dumper::Sortkeys = 1;

my %h1 = (qw/a 1 b 2 c 3 d 4/);
print "Adresse h1 -> ", \%h1, "\n";
print 'h1 : ', Dumper \%h1;

my $h2 = \%h1;
print "Adresse h2 -> ", $h2, "\n";
$h2->{c} = 33;
print 'h1 : ', Dumper \%h1;
print 'h2 : ', Dumper $h2;

my $h3 = { %h1 };
print "Adresse h3 -> ", $h3, "\n";
$h3->{d} = 44;
print 'h1 : ', Dumper \%h1;
print 'h3 : ', Dumper $h3;


Ausgabe:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Adresse h1 -> HASH(0x1a45960)
h1 : $VAR1 = {
'a' => '1',
'b' => '2',
'c' => '3',
'd' => '4'
};
Adresse h2 -> HASH(0x1a45960)
h1 : $VAR1 = {
'a' => '1',
'b' => '2',
'c' => 33,
'd' => '4'
};
h2 : $VAR1 = {
'a' => '1',
'b' => '2',
'c' => 33,
'd' => '4'
};
Adresse h3 -> HASH(0x1ae0c0c)
h1 : $VAR1 = {
'a' => '1',
'b' => '2',
'c' => 33,
'd' => '4'
};
h3 : $VAR1 = {
'a' => '1',
'b' => '2',
'c' => 33,
'd' => 44
};


Wie man sieht, ist die Referenz eines Hashes mit dem Hash auf gewisse Weise gleichbedeutend, da sie schließlich nur auf dessen Adresse verweist. Die Kopie (h3) hingegen liegt an einer anderen Speicherstelle und die Schlüssel wurden schön kopiert. Die Werte auch. Aber nur kopiert, nicht gecloned! (Siehe unten...)

Es folgt gleich noch ein zweites Beispiel zur Demonstration der "flachen" Kopien.\n\n

<!--EDIT|Crian|1109865025-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
<< |< 1 2 3 >| >> 21 Einträge, 3 Seiten



View all threads created 2005-03-02 23:06.