Schrift
[thread]7888[/thread]

2 array Fragen. (Seite 4)

Leser: 1


<< |< 1 2 3 4 5 >| >> 48 Einträge, 5 Seiten
shaihulud
 2006-04-21 13:31
#64878 #64878
User since
2006-04-12
76 Artikel
BenutzerIn
[default_avatar]
verdammt nochmal ich krieg das mit den keys nicht hin...

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


wie muss ich die foreach-schleife schreiben um die $header auszulesen? der code vom dubu macht mich ganz quirre..

Code: (dl )
1
2
3
4
5
6
foreach my $ele (@array) {
print "$ele\n";
for my $key ( keys($ele) ) {
print "$ele{$key}\n";
}
}

Type of arg 1 to keys must be hash (not private variable) at functions.pm line 61, near "$ele) "
Global symbol "%ele" requires explicit package name at functions.pm line 62.
Execution of functions.pm aborted due to compilation errors.

Edit Relais: Code-Tags spendiert. Zeilenumbruch repariert.\n\n

<!--EDIT|Relais|1145616763-->
Matze
 2006-04-21 14:41
#64879 #64879
User since
2005-08-29
222 Artikel
BenutzerIn
[Homepage] [default_avatar]
Benutze Code-Tags!
Lies dir mal die perldoc zu Referenzen durch.
Anscheined kommst du mit der Syntax noch nicht ganz klar.
perlref

Ausserdem hast du Dubus post immer noch nicht beachtet!
So wie dus jetzt hast wäre es wohl so besser:
Code: (dl )
1
2
3
4
5
6
7
8
foreach my$ele (@array) {
#   print "$ele\n";
    # Kannste weglassen

  foreach my$ele2 (keys %$ele) {
    print $ele->{$ele2},"\n";
  }
}

Dann funktioniert es, aber es ist nicht gut so!
Schließlich wolltest du ja noch den Zähler drin haben.

MfG. Matze
Mit freundlichen Grüßen: Matze
shaihulud
 2006-04-21 14:45
#64880 #64880
User since
2006-04-12
76 Artikel
BenutzerIn
[default_avatar]
die richtige reihenfolge ist ja da dadurch dass ich den hash in nen array haue während ich ihn fülle. das reicht mir ja.
mein ziel war es ja nur ihn in der gleichen reihenfolge auslesen zu können wie ich ihn eingelesen habe und daher wollte ich wissen wie es bei der array-hash variante mit dem auslesen der keys funktioniert weil ich die auch wieder brauche,
aber du hast völlig recht ich bin mit der ganzen syntax noch nicht vertraut und versuch mich grad an klassenkrams nebenher.. ich glaub ich sollte mir n perlbuch holen um alles besser nachlesen zu können. kann mir da jemand eins empfehlen? aber keins mit purem fachlatein bitte :)

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
  foreach (@Zeilen){
if ($typ == 1 && /$dokuart\;$zahl1\;(\d+)/){
$zahl1 = $1;
open(DATEI, "<C:/Beispieldaten/Konfigurationsdaten/20060310.REPOSITORY") || die "Datei nicht gefunden";
my @Zeilen = <DATEI>;
close(DATEI);
foreach(@Zeilen){
if(/^$zahl1;([^;]+)/){
$header = $1;
#print "$header\n";
}
}
$hash{$header} = $inhalt;
push(@array,\%hash);
}
}
}
foreach my$ele (@array) {
foreach my$ele2 (keys %$ele) {
print $ele->{$ele2},"\n";
}
}

das funzt auch nicht so wie ich das gern hätte.. er gibt mir zwar jetzt die keys aus aber 7 mal halt. es sind 7 keys die er mir 7 mal ausgibt. 12345671234567123...\n\n

<!--EDIT|renee|1145624223-->
Relais
 2006-04-21 14:56
#64881 #64881
User since
2003-08-06
2244 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=shaihulud,21.04.2006, 11:31]
Code: (dl )
1
2
      $hash{$header} = $inhalt;
push(@array,\%hash);
[/quote]
Hier nimmst Du eine Referenz auf einen existierenden Hash... wenn Du das mehrmals tust, wird automatisch bei allen Vorkommen dieses Hashes der aktuelle Inhalt stehen.

Du willst vermutlich, daß der Inhalt zum Zeitpunkt des Einfügens drin bleibt, daher mußt Du eine Kopie des Hashes referenzieren, Das geht so:
Code: (dl )
      push(@array, [ %hash ] );


Update: Doku zum Lesen:
perlreftut - Referenztutorial (deutsch)
perlref - Referenzen (leider noch englisch)
perllol - Verschachtelte Listen und Datenstrukturen (deutsch)
perldsc - Datenstrukturen (deutsch)

Und bitte verwende unsere schönen
Code: (dl )
[CODE]-Tags.
\n\n

<!--EDIT|Relais|1145617260-->
Erst denken, dann posten --
26. Deutscher Perl- u. Raku -Workshop 15. bis 17.04.2024 in Frankfurt/M.

Winter is Coming
Matze
 2006-04-21 15:02
#64882 #64882
User since
2005-08-29
222 Artikel
BenutzerIn
[Homepage] [default_avatar]
Stimmt, mit Buch gehts viel leichter!
Ich würde dir das Buch 'Perl in 21 Tagen' von 'Markt und
Technik' empfeheln, es erklärt den Umgang mit Zahlen, Perl
Scalare Variablen, Arrays, Hashes, Regular Expressions,
Subroutinen, Module POD-Documentationen, Webprogram-
mieung mit CGI, (dazu ein bisschen HTML), Referenzen,
Klassen, Objekte, (also komplett OOP), Server-Client-
Programme, Einführung in die Win32-API, Ausblicke auf Perl 6,
Einblicke in TK, Viele kleine Übungsaufgaben(und Lösungen),
Hilfe zur Perl-Installation und zu Modul-Installationen, Perl-
Spezial-Variablen werden vorgestellt, und dazu wird noch alles
sehr gut erläutert und man kann es einfach zu lesen /
verstehen.

Das ist kein Scherz, es behandelt wirklich alles was ich da
oben aufzähle, und man kann das Buch als völliger Anfänger
sehr gut gebrauchen, wie auch als Fortgeschrittener, der nur
mal schnell was nachlesen möchte.

Und du kannst dir ja noch die Wiki:BuchEmpfehlungen ansehen.

MfG. Matze
Mit freundlichen Grüßen: Matze
shaihulud
 2006-04-21 15:40
#64883 #64883
User since
2006-04-12
76 Artikel
BenutzerIn
[default_avatar]
danke für die info. hab auch den fehler gefunden wegen dem sieben mal wiederholen. war n logischer programmfehler.
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
  foreach (@Zeilen){
if ($typ == 1 && /$dokuart\;$zahl1\;(\d+)/){
$zahl1 = $1;
open(DATEI, "<C:/Beispieldaten/Konfigurationsdaten/20060310.REPOSITORY") || die "Datei nicht gefunden";
my @Zeilen = <DATEI>;
close(DATEI);
foreach(@Zeilen){
my %hash;
if(/^$zahl1;([^;]+)/){
$header = $1;
$hash{$header} = $inhalt;
push(@array,\%hash);
#print "$header\n";
}
}
}

}
}
foreach my$ele (@array) {
# print "$ele\n";
# Kannste weglassen
foreach my$ele2 (keys %$ele) {
print $ele->{$ele2},"\n";
}
}

so isses richtig. ich hab den hash nie neu initialisiert gehabt... *peinlich*

@matze werd mich mal wegen dem buch erkundigen danke :)\n\n

<!--EDIT|renee|1145624342-->
Crian
 2006-04-21 16:06
#64884 #64884
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
1) die Version von Relais finde ich schöner
2) benutze doch bitte die [CODE]-Tags des Forums
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
Dubu
 2006-04-22 23:32
#64885 #64885
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Nachdem du jetzt mal den ganzen Code gepostet hast, wird eines klar: Du brauchst den Hash gar nicht.
Momentan legst du in jedem Schleifendurchlauf einen neuen Hash an, der nur ein Element bekommt und dann im Array gespeichert wird. Da brauchst du gar keinen Hash, da reicht ein anonymes Array. Und du kannst dir bei der Ausgabe diese komische verschachtelte Schleife sparen.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
foreach (@Zeilen) {      # woher kommen diese @Zeilen?
...
    open(DATEI, '< ', 'C:/Beispieldaten/Konfigurationsdaten/20060310.REPOSITORY')
       or die "Konnte Datei nicht öffnen: $!";
   while (<DATEI>) {
       if(/^$zahl1;([^;]+)/){
           push(@array, [ $1, $inhalt ]); # Referenz auf anonymes Array mit $1 und $inhalt landet in @array
           # woher kommt eigentlich $inhalt?
       }
   }
...
}

foreach my $element (@array) {
   print "$element->[0] => $element->[1]\n";
}


Ich hoffe auch, dass dir bewusst ist, dass du in deinem Code zwei Variablen mit Namen @Zeilen im gleichen Namespace hattest, die offensichtlich vollkommen unterschiedliche Bedeutung haben. Das ist mehr als unschön.
Noisebreath
 2006-04-23 11:49
#64886 #64886
User since
2006-04-14
72 Artikel
BenutzerIn
[default_avatar]
#hier ist auch noch code drüber..
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
open(DATEI, "<C:/Beispieldaten/Konfigurationsdaten/20060310.DOCFIELD") || die "Datei nicht gefunden";
 my @Zeilen = <DATEI>;
 close(DATEI);
 
 foreach (@Zeilen){
   if ($typ == 1 && /$dokuart\;$zahl1\;(\d+)/){
     $zahl1 =  $1;    
     open(DATEI, "<C:/Beispieldaten/Konfigurationsdaten/20060310.REPOSITORY") || die "Datei nicht gefunden";
     my @Zeilen = <DATEI>;
     close(DATEI);
     foreach(@Zeilen){
     my %hash;
       if(/^$zahl1;([^;]+)/){

         etc.....

danke für die info

//modedit GwenDragon: +Code-Tags; Bitte Code-Tags benutzen!\n\n

<!--EDIT|GwenDragon|1145787222-->
Strat
 2006-04-23 17:53
#64887 #64887
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=Matze,21.04.2006, 13:02]Stimmt, mit Buch gehts viel leichter![/quote]
kennst du schon die "Einfuehrung in Perl" auf meiner HP unter Vortraege? die deckt die Basics (IO, Skalare, Arrays, Hash, Subroutinen, Regulaere Ausdruecke und noch ein wenig mehr) recht gut ab, und ist kostenlos.

Eine neue Version ist uebrigens in Vorbereitung und muesste hoffentlich in den naechsten 1-2 Wochen fertig werden.
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< |< 1 2 3 4 5 >| >> 48 Einträge, 5 Seiten



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