Hallo,
ich habe einen Haufen von Textdateien und ein Interface zur Eingabe eines Suchbegriffs. Ich möchte dass der Benutzer nutzen kann:
- Regexps
- and, or, not
- Klammern
Gibt es eine elgante Möglichkeit oder ein fertiges Modul, mit dem das geht?
Meine Version bisher scheint mir etwas Holzhammermäßig, sie parst sicherlich nicht jede verschachtelte Eingabe richtig und erzeugt einen String mit dem kompletten Dateiinhalt und durchsucht diesen mit //s:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
my $q = 'foo and not (bar or beer)';
$q =~ s/(^|[^\\])\//$1\\\//g;
my $searchexpr = join ' ', map {s/\/(and|or|not)\/si/$1/gi;$_} map {s/([^\(\)]+)/\/$1\/si/g;$_} split /\s+/, $q;
$searchexpr =~ s/\/si (not )?\//\/si and $1\//g;
my $found = 0;
foreach my $d (@files) {
open F, $d;
my @f = <F>;
$_ = join '', @f;
$found++ if eval $searchexpr;
close F; }
print 'The expression was true in '.$found.' files';
Last edited: 2011-05-04 13:43:59 +0200 (CEST)