Thread nach dem Fund Zeilennummern auch zurückgeben (22 answers)
Opened by Henri at 2015-05-09 15:57

murphy
 2015-05-09 18:40
#180987 #180987
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Um an eine Zeilennummer zu kommen gibt's natürlich mehrere Möglichkeiten: Zähler für die Zeile in der Schleife hochzählen, über die Arrayindices statt über die Arrayeinträge iterieren oder auch die Datei einfach zeilenweise einlesen und die eingebaute Zeilennummervariable verwenden.

Um alle Zeilennummern zu speichern wäre es dann sinnvoll, in dem Hash Arrays von Zeilennummern zu hinterlegen statt die Anzahl der Treffer in der letzten Zeile zu speichern.

Schließlich sollte man die Suchbegriffe am besten noch sauber escapen, falls sie nicht garantiert immer korrekte reguläre Ausdrücke sind.

Mir ist auch nicht ganz klar, in welcher Form die Suchbegriffe denn nun auftreten dürfen, denn der Code sucht nach Dingen die mit Whitespace oder Semikolon vom übrigen Text abgeteilt sind, während das Beispiel nahelegt, dass das nicht erforderlich sein sollte.

Eine mögliche Lösung könnte so aussehen:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/perl
use 5.012;
use warnings;

my %matches;
my @candidates = qw(Wort1 Wort2 wort3 wort4);

while (my $line = <DATA>) {
    for my $candidate (@candidates) {
        push @{$matches{$candidate}}, $. if ($line =~ m/(^|[\s.;])\Q$candidate\E([\s.;]|$)/i);
    }
}

while (my ($candidate, $linenos) = each %matches) {
    say "$candidate found on line ", join(", ", @{$linenos});
}

__DATA__
aaaaaaaaaaaaaaaaaaaaa.wort1;aaaaaaaa
bbbbbbbbbbbbbb wort2 bbbbbbbbbbbbbbb
ccccccccccccccccccccc wort3 cccccccc
ddddddddddd wort1 dddddwort2dddddddd
eeeeeeeeeeeeeeeeeeee wort4 eeeeeeeee
When C++ is your hammer, every problem looks like your thumb.

View full thread nach dem Fund Zeilennummern auch zurückgeben