1
2
3
4
5
6
7
8
9
10
<xml>
<knoten>
<x>!!!</x>
<y>!!!</y>
</knoten>
<knoten>
<x>!!!</x>
<y>!!!</y>
</knoten>
</xml>
use XML::LibXML;
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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
#!/usr/bin/perl use warnings; use strict; my $a = <<HERE; <xml> <knoten> <2>!!!</2> <y>15</y> </knoten> <knoten> <4>!!!</4> <y>30</y> </knoten> </xml> HERE my @b = split("\n", $a); my @xvals = (2, 4, 6, 8); my @collection = (); my $i; my $u; for ($i=0; $i < $#b; $i++) { foreach $u (@xvals) { if ($b[$i] =~ /<$u>[^>]*<\/$u>/) { if ($b[$i + 1] =~ /<.+>([^>]*)<\/.+>/) { my $href = {$u => $1}; push(@collection, $href); last; } else { die "Error: No y-line after x-line,"; } } } } my %result = (); foreach $i (@xvals) { foreach $u (@collection) { my %hash = %{$u}; my @onehashkey = keys(%hash); my $key = $onehashkey[0]; if ($key eq $i) { $result{$key} += $hash{$key}; } } } foreach $i (sort(keys(%result))) { print "$i => $result{$i}\n"; }
2012-03-08T15:47:16 FIFOGuest turbo... dieses wertepaar landet für jeden knoten in einem array. (quasi @array=("x : y","x : y",...) )
ich möchte jetzt gerne alle <y> werte für x=2/x=4 usw aufaddieren.
Na, leg einen Hash an (mit den x-Werten als keys) und mach an der Stelle, wo das Wertepaar in einem array landet, ein $sum_hash{$x} += $y;. Vorher nicht existente keys werden automatisch angelegt.
Quoteaber da ich damit noch nie gearbeitet hab, hab ich mich da nicht so richtig rangetraut..
1 2 3 4
use Data::Dumper; print Dumper \%ENV; # Dumper kriegt eine Hash-Referenz übergeben # und stellt den Hash %ENV sehr anschaulich dar