Hallo Liste, auch wenn meine Frage etwas Off-Topic ist, würde ich mich dennoch über eine Antwort freuen: Kann mir mal jemand verraten, was bei untenstehendem Perl-Script (vereinfacht dargestellt) passiert. Mein Problem ist, dass ich die Zuordnung der Daten aus dem Array in den Hash nicht verstehe. # ---------------------------- while (<LOGFILE>) { $eintrag={ SRC_1=>$src1, SRC_2=>$src2, DES_1=>$dest1, DES_2=>$dest2, POR_1=>$por1, DATA1=>$data1, DATA2=>$data2, DATA3=>$data3 }; %hash->{$eintrag->{DES_1}}->{$eintrag->{SRC_1}} +=$eintrag->{DATA1}; %hash->{$eintrag->{DES_1}}->{"SUMME"} += $eintrag->{DATA1}; %hash->{"SUMME"}->{"GESAMT"} += $eintrag->{DATA1}; %hash->{"SUMME"}->{$eintrag->{POR_1}} += $eintrag->{DATA1}; } # ---------------------------- Danke Andreas Rau
"Andreas Rau"
while (<LOGFILE>) { $eintrag={ SRC_1=>$src1, SRC_2=>$src2, DES_1=>$dest1, DES_2=>$dest2, POR_1=>$por1, DATA1=>$data1, DATA2=>$data2, DATA3=>$data3 };
%hash->{$eintrag->{DES_1}}->{$eintrag->{SRC_1}} +=$eintrag->{DATA1}; %hash->{$eintrag->{DES_1}}->{"SUMME"} += $eintrag->{DATA1}; %hash->{"SUMME"}->{"GESAMT"} += $eintrag->{DATA1}; %hash->{"SUMME"}->{$eintrag->{POR_1}} += $eintrag->{DATA1};
} # ----------------------------
Das jetzt hier detailliert zu beschreiben führt sicherlich zu weit, nur soviel: $eintrag ist kein Hash, sondern eine Referenz auf einen (anonymen) Hash. $hash{foobar} enthält wohl ebenfalls Referenzen auf einen anderen Hash. Um zu verstehen, was hier passiert, musst Du Dich also mit Referenzen vertraut machen. 'perldoc perlref' in ein Terminal Deiner Wahl gehackt hilft Dir da vielleicht weiter. HTH, Martin
On Monday 27 September 2004 14:26, Andreas Rau wrote:
Kann mir mal jemand verraten, was bei untenstehendem Perl-Script (vereinfacht dargestellt) passiert. Mein Problem ist, dass ich die Zuordnung der Daten aus dem Array in den Hash nicht verstehe.
# ----------------------------
while (<LOGFILE>) { $eintrag={ SRC_1=>$src1, SRC_2=>$src2, DES_1=>$dest1, DES_2=>$dest2, POR_1=>$por1, DATA1=>$data1, DATA2=>$data2, DATA3=>$data3 };
Zum Verständis des Ausschnittes fehlen leider die "lästigen Details". Ich seh' auch nirgendwo ein Array 'rumstehen. Trotzdem mal einige Punkte: $eintrag ist eine Referenz auf einen hash, man muß also dereferenzieren, wenn man auf ein hash-Element zugreifen will: $eintrag->{XYZ} = "abc"; oder $abc = $eintrag->{XYZ};
%hash->{$eintrag->{DES_1}}->{$eintrag->{SRC_1}} +=$eintrag->{DATA1}; %hash->{$eintrag->{DES_1}}->{"SUMME"} += $eintrag->{DATA1}; %hash->{"SUMME"}->{"GESAMT"} += $eintrag->{DATA1}; %hash->{"SUMME"}->{$eintrag->{POR_1}} += $eintrag->{DATA1};
das soll wirklich funktionieren? Sollte es nicht $hash->{...} -----^----- heissen? Steht da am Beginn der Datei #!/usr/bin/perl -w -------------------------^^^ oder sind die Warnungen ausgeschalten. Die Datenstrukturen sind ja einigermassen komplex. manchmal hilft es den Data::Dump zu benutzen um sich die Strukturen anzeigen zu lassen. > perldoc Data::Dumper Data::Dumper - stringified perl data structures, bye Jürgen -- Dr.rer.nat. Juergen Vollmer, Viktoriastrasse 15, D-76133 Karlsruhe Tel: +49(721) 9204871 Fax: +49(721) 24874 Juergen.Vollmer@informatik-vollmer.de www.informatik-vollmer.de Internet-Telefonie: www.skype.com Benutzer: juergen.vollmer
Hallo Jürgen, ich muss gestehen, dass mich erst seit Kurzem mit Perl beschäftigte und mehr oder weniger grundlegende Programmierkenntnisse besitze. [...]
# ---------------------------- while (<LOGFILE>) { $eintrag={ SRC_1=>$src1, DES_1=>$dest1, DATA1=>$data1 };
[...]
Trotzdem mal einige Punkte:
$eintrag ist eine Referenz auf einen hash, man muß also dereferenzieren, wenn man auf ein hash-Element zugreifen will: $eintrag->{XYZ} = "abc"; oder $abc = $eintrag->{XYZ};
%hash->{$eintrag->{DES_1}}->{$eintrag->{SRC_1}} +=$eintrag->{DATA1}; %hash->{$eintrag->{DES_1}}->{"SUMME"} += $eintrag->{DATA1}; %hash->{"SUMME"}->{"GESAMT"} += $eintrag->{DATA1}; %hash->{"SUMME"}->{$eintrag->{POR_1}} += $eintrag->{DATA1};
das soll wirklich funktionieren?
Ja das ganze funktioniert in der Tat: http://www.acelab.net/brickreporter/brickreporter.tar.gz Meine Absicht ist es dieses Script, meinen Befürnissen etwas anzupassen. Das in diesem Posting ursprünglich aufgezeigte Script habe ich vereinfacht dargestellt. Mich interessiert hauptsächlich, was in den Zeilen "%hash->" passiert. Auf Empfehlung einer weiteren Antwort auf mein Posting werde ich mich nun erstmal mit "perldoc perlref" auseinandersetzen.
Sollte es nicht $hash->{...} -----^----- heissen?
Sollte die Spitze unter dem "$" stehen?
Steht da am Beginn der Datei #!/usr/bin/perl -w -------------------------^^^ oder sind die Warnungen ausgeschalten.
Warnungen sind an. Orginal-Script läuft ohne Warnmeldungen durch. Gruß Andreas
Hallo, [ .. ] ich kenne diese Schreibweise:
%hash->{$eintrag->{DES_1}}->{$eintrag->{SRC_1}} +=$eintrag->{DATA1}; %hash->{$eintrag->{DES_1}}->{"SUMME"} += $eintrag->{DATA1}; %hash->{"SUMME"}->{"GESAMT"} += $eintrag->{DATA1}; %hash->{"SUMME"}->{$eintrag->{POR_1}} += $eintrag->{DATA1}; NICHT (!), aber ich vermute (?) dass mit += $eintrag->{DATA1}; dem Hash %hash %hash->{$a}{$b} ein Element (key=>value) hinzugefügt werden soll.
Traditionell würde ich es aber so schreiben: $hash{$a}{$b}{DATA1} = $eintrag->{DATA}; Versuche mal eine 'Ersetzung', und schau ob's Gleiche herauskommt Calli P.S.: Habe Deine Frage einer Perl-Liste gestellt, Antwort demnächst
Hallo Carl,
[ .. ] ich kenne diese Schreibweise:
%hash->{$eintrag->{DES_1}}->{$eintrag->{SRC_1}} +=$eintrag->{DATA1}; %hash->{$eintrag->{DES_1}}->{"SUMME"} += $eintrag->{DATA1}; %hash->{"SUMME"}->{"GESAMT"} += $eintrag->{DATA1}; %hash->{"SUMME"}->{$eintrag->{POR_1}} += $eintrag->{DATA1}; NICHT (!), aber ich vermute (?) dass mit += $eintrag->{DATA1}; dem Hash %hash %hash->{$a}{$b} ein Element (key=>value) hinzugefügt werden soll.
Traditionell würde ich es aber so schreiben: $hash{$a}{$b}{DATA1} = $eintrag->{DATA};
Versuche mal eine 'Ersetzung', und schau ob's Gleiche herauskommt
Damit geht es: %hash->{$des_1}{$src_1} +=$eintrag->{DATA1}; %hash->{$src_ip}{"SUMME"} += $eintrag->{DATA1}; %hash->{"SUMME"}{"GESAMT"} += $eintrag->{DATA1}; %hash->{"SUMME"}{$por_1} += $eintrag->{DATA1}; wobei das += erforderlich ist, da hier der Werte aus $eintrag{DATA1} summiert wird.
P.S.: Habe Deine Frage einer Perl-Liste gestellt, Antwort demnächst
Welche Perl-Liste? Gruß Andreas Rau
Hallo, Am Mon, 27 Sep 2004, Andreas Rau schrieb:
Hallo Jürgen,
Wer schrieb hier was?
%hash->{$eintrag->{DES_1}}->{$eintrag->{SRC_1}} +=$eintrag->{DATA1}; %hash->{$eintrag->{DES_1}}->{"SUMME"} += $eintrag->{DATA1}; %hash->{"SUMME"}->{"GESAMT"} += $eintrag->{DATA1}; %hash->{"SUMME"}->{$eintrag->{POR_1}} += $eintrag->{DATA1};
das soll wirklich funktionieren?
Ja das ganze funktioniert in der Tat: http://www.acelab.net/brickreporter/brickreporter.tar.gz
Meine Absicht ist es dieses Script, meinen Befürnissen etwas anzupassen. Das in diesem Posting ursprünglich aufgezeigte Script habe ich vereinfacht dargestellt. Mich interessiert hauptsächlich, was in den Zeilen "%hash->" passiert.
Ist relativ einfach, wenn man das mal etwas anders schreibt: $hash->{ $eintrag->{DES_1} }->{ $eintrag->{SRC_1} } += $eintrag->{DATA1}; $hash->{ $eintrag->{DES_1} }->{ "SUMME" } += $eintrag->{DATA1}; Die Schluessel von $hash sind die dereferenzierten Werte aus $eintrag. Also: $hash->{'Wert_von_DES_1'}->{'Wert_von_SRC_1'} += Wert_von_DATA1; $hash->{'Wert_von_DES_1'}->{'SUMME'} += Wert_von_DATA1; Wozu $eintrag ueberhaupt gebraucht wird geht aus dem Fragment nicht hervor. -dnh -- booting wetware is a critical process - it affects the systems mood
participants (5)
-
Andreas Rau
-
Carl A. Schreiber
-
David Haller
-
Dr. Jürgen Vollmer
-
Martin Schmitz