Thread In "grep" ZWEI Bedingungen erfüllen (23 answers)
Opened by Gast at 2007-04-20 16:56

PerlProfi
 2007-04-20 22:18
#76097 #76097
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
So, das Beispiel:
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
34
#!/usr/bin/perl
use strict;
use warnings 'all';
use Data::Dumper;

my @found = ("10\tdomain-a", "12\tdomain-b", "5\tdomain-c",
"8\tdomain-a", "14\tdomain-b", "15\tdomain-c",
"11\tdomain-a", "13\tdomain-b", "10\tdomain-c");

# get doubles
my %seen;
foreach my$i (0..$#found) {
my @ele = split("\t", $found[$i]);
$seen{$ele[-1]} = [] unless $seen{$ele[-1]};
push(@{$seen{$ele[-1]}}, [$i, $ele[0]]);
}

# delete doubles
foreach my$key (keys %seen) {
if (@{$seen{$key}} > 1) {
# sort
my $top = $seen{$key}->[0];
foreach my$act (@{$seen{$key}})
{ if ($act->[1] > $top->[1]) { $top = $act } }

# splice
foreach my$act (@{$seen{$key}})
{ if ($act->[0] != $top->[0]) { $found[$act->[0]] = undef } }
}
}
@found = grep { defined($_) } @found;

# output
print "\@FOUND:\n", Dumper(\@found), "\n";

Ich bin mir aber ziemlich sicher, dass das ganze noch viel einfacher zu lösen ist.

Und mal eine Erklärung zum code:
Zuerst werden alle indizes und deren jeweilige Trefferzahl der Haupt-Domain in %seen eingeordnet.
Jeder key von %seen ist dabei eine Haupt-Domain, jeder value ein anon. Array der mit anon. Arrays gefüllt ist, welche jeweils an 0. Position den Index in @found gespeichert haben und an 1. Position die Trefferzahl.

In der 2. foreach-Schleife kann ich jetzt nachsehen, ob die jeweilige Haupt-Domain nu einmal vorkommt, kommt sie öfter vor, suche ich mir den eintrag mit der höchsten Trefferzahl und ersetze alle anderen Einträge aus @found mit undef.

edit: das mit splice() geht wohl doch nicht, aber ohne funktioniert es wenigstens, kann mir vielleicht jemand sagen, wie das mit splice zu lösen wäre ?

MfG\n\n

<!--EDIT|PerlProfi|1177093617-->

View full thread In "grep" ZWEI Bedingungen erfüllen