Schrift
[thread]7888[/thread]

2 array Fragen. (Seite 3)

Leser: 1


<< |< 1 2 3 4 5 >| >> 48 Einträge, 5 Seiten
Matze
 2006-04-20 21:23
#64868 #64868
User since
2005-08-29
222 Artikel
BenutzerIn
[Homepage] [default_avatar]
An deiner foreach-Schleife hab ich nichts falsches gesehen, nur speicherst du falsch.
Du musst es als Referenz speichern, und wenn du dann eine Referenz als Element deines Arrays hast, musst du auch noch die foreach-Schleife ändern, so:

Speichern, so:
Code: (dl )
1
2
$hash{$header} = $inhalt;
push(@array,\%hash);


foreah-Schleife dann so:
Code: (dl )
1
2
3
foreach my$ele (@array) {
print %$ele;
}


Wenn du das gemacht hast, und es immer noch Fehler gibt, dann liegt es jedenfalls nicht daran.

MfG. Matze
Mit freundlichen Grüßen: Matze
Dubu
 2006-04-21 00:42
#64869 #64869
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Es ist doch Unsinn, den Hash nochmal in einem Array zu speichern (ob jetzt als Referenz oder Kopie), wenn es nur um die Reihenfolge der Elemente geht.

Wenn man weiß, dass die Hashkeys definitiv verschieden sind, kann man es so machen:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
while (...) {
   ...
   $hash{$header} = $inhalt;
   push @keys, $header;
   ...
}
...
for my $key (@keys) {
   print "$key => $hash{$key}\n";
}


Wenn man sich mit den Schlüsseln nicht sicher ist, kann man auch die Struktur etwas komplizierter machen und einen Zähler einbauen:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
my $cnt = 0;
while (...) {
   ...
   $hash{$header} = [$cnt, $inhalt];
   ++$cnt;
   ...
}
...
for my $key (sort { $hash{$a}[0] <=> $hash{$b}[0] } keys %hash) {
   print "$key => $hash{$key}[1]\n";
}

(ungetestet)

Im allgemeinen Fall ist wohl die Verwendung von CPAN:Tie::IxHash besser.
Matze
 2006-04-21 00:50
#64870 #64870
User since
2005-08-29
222 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ich habs ja auch nur geschrieben, weil er das so machen
wollte.
Die Zählerstruktur würde ich allerdings Tie vorziehen.
Für soetwas simples muss man nicht gleich ein neues Modul
downloaden, finde ich.

MfG. Matze
Mit freundlichen Grüßen: Matze
Dubu
 2006-04-21 03:03
#64871 #64871
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
[quote=Matze,20.04.2006, 22:50]Für soetwas simples muss man nicht gleich ein neues Modul
downloaden, finde ich.[/quote]
Tie::IxHash ist die Standard-Lösung für das Problem "sortierter Hash".

Das Schöne an dem Modul ist, dass man außer einem Aufruf von tie() bei der Deklaration des Hashes nichts am eigenen Code ändern muss. (Man kann aber auch das von Tie::IxHash definierte objektorientierte Interface benutzen, wenn man möchte.)
shaihulud
 2006-04-21 03:20
#64872 #64872
User since
2006-04-12
76 Artikel
BenutzerIn
[default_avatar]
1. wie bekomme ich aus der foreach schleife value UND key?
hab so ne variante probiert ging aber in die hose :

foreach my $ele (@array) {
print "$ele\n";
foreach my $key (keys my %ele){
print "$key\n";
}
}

2.Also was ich nicht verstehe ist wieso ich dass dann per referenz übergeben muss.
$hash{$header} = $inhalt;
push(@array,\%hash);

aber ich sehe auch dass es nur geht wenns per referenz ist..
aus meiner sicht muesste aber doch im array auch bei valueübergabe trzdem das gleiche drin stehn.. wieso stehn aber ohne referenzübergabe die dinge mehrmals im array?

kann mir jemand bei meinem Verständnis helfen?\n\n

<!--EDIT|shaihulud|1145575840-->
lichtkind
 2006-04-21 04:05
#64873 #64873
User since
2004-03-22
5708 Artikel
ModeratorIn + EditorIn
[Homepage]
user image
dubu hat eigentlich schon alles geschrieben schau sein zweites beispiel an
Wiki:Tutorien in der Wiki, mein zeug:
kephra, baumhaus, garten, gezwitscher

Es beginnt immer mit einer Entscheidung.
Matze
 2006-04-21 11:45
#64874 #64874
User since
2005-08-29
222 Artikel
BenutzerIn
[Homepage] [default_avatar]
Quote
2.Also was ich nicht verstehe ist wieso ich dass dann per referenz übergeben muss.

Wenn du es nicht als Referenz übergibst, dann wird dem Array nur eine Liste übergeben, das heißt, dass dein Array jeden Key und jeden Value des Hashes als ein eigenes Element bekommt.

Beispiel:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
%hash = (
  abc => "Alphabet",
  123 => "Ein-mal-eins");

push(@array,%hash);

# @array:
# 0 : abc
# 1 : Alphabet
# 2 : 123
# 3 : Ein-mal-eins


@Dubu: Ist bei dem OO Interface von Tie::IxHash schon eine Lösung zum sortieren des Hashes mit drin, oder muss man es selbst noch schreiben(wie beim normalen tie()) ?
Scheint ganz interresant zu sein...

MfG. Matze
Mit freundlichen Grüßen: Matze
renee
 2006-04-21 11:51
#64875 #64875
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Welche Art von Sortierung meinst Du?

Das Modul sorgt dafür, dass die Elemente in der Reihenfolge bleiben, wie sie eingefügt werden. Dann kann noch nach den Schlüsseln bzw. den Werten sortiert werden

Aus perldoc Tie::IxHash:
Code: (dl )
1
2
3
4
5
6
SortByKey

Reorders the IxHash elements by textual comparison of the keys.
SortByValue

Reorders the IxHash elements by textual comparison of the values.
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/
renee
 2006-04-21 11:52
#64876 #64876
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Für sortierte Hashes kann man auch CPAN:Tie::Hash::Sorted benutzen...
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/
Matze
 2006-04-21 12:08
#64877 #64877
User since
2005-08-29
222 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ich glaube ich werde mir mal das Modul downloaden.
Scheint sehr nützlich zu sein.
Was ist den der genaue Unterschied zu Tie::IxHash::Sorted ?
Wenn man doch bei Tie::IxHash auch sortieren kann ?

MfG. Matze
Mit freundlichen Grüßen: Matze
<< |< 1 2 3 4 5 >| >> 48 Einträge, 5 Seiten



View all threads created 2006-04-13 12:27.