Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]7140[/thread]

Zeilen mit mehreren Suchbegriffen ausgeben



<< |< 1 2 >| >> 16 Einträge, 2 Seiten
Georges
 2005-07-17 17:43
#56470 #56470
User since
2005-07-14
13 Artikel
BenutzerIn
[default_avatar]
Ich habe ein kleines Suchskript erstellt um Literaturverweise aus umfangreichen txt-Verzeichnissen durchsuchen zu können. Mein Suchformular enthält die Möglichkeit zwischen Boolschem UND und ODER umzuschalten.
Der Abschnitt des Skripts für die UND-Suche mehrerer Begriffe funktioniert zwar, erscheint mir aber sehr umständlich. Zudem erhalte ich im error_log des Apache-servers hier immer Fehlermeldungen:
....Use of uninitialized value in regexp compilation at lit_search1.pl line XYZ ....
Code: (dl )
1
2
3
4
5
6
7
8
   
...... elsif ($BOOL eq 'und'){
if($line =~ /$TEXTS[0]/) {
if($line =~ /$TEXTS[1]/) {
if($line =~ /$TEXTS[2]/) {
if($line =~ /$TEXTS[3]/) {
if($line =~ /$TEXTS[4]/) {
......


im String $line werden nacheinander die aus dem Formular ausgelesenen und in einem Array @TEXTS gespeicherten Begriffe abgefragt, und darüber die Ausgabe eingeengt.

Weis jemand dafür vielleicht einen eleganteren und fehlerfreien Weg???

Gruß Georges
pq
 2005-07-17 17:55
#56471 #56471
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=Georges,17.07.2005, 15:43]Zudem erhalte ich im error_log des Apache-servers hier immer Fehlermeldungen:
....Use of uninitialized value in regexp compilation at lit_search1.pl line XYZ ....[/quote]
das ist eine warnung. übersetzt heißt das etwa "benutzung eines uninitialisierten (undefinierten) wertes in einer regex-compilierung".
perl sagt dir sogar die betreffende zeile, die scheint dich aber nicht zu interessieren.
$TEXT[...] ist jedenfals an einer stelle undefiniert.
solang wir nicht wissen, wie das array @TEXT zustande kommt und wie das
formular aussieht, ist es schwer, dir zu helfen.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Georges
 2005-07-17 18:49
#56472 #56472
User since
2005-07-14
13 Artikel
BenutzerIn
[default_avatar]
Danke erst mal für die rasche Antwort.
Natürlich interessiert mich die Zeile, auf die der Fehler verweist, es sind jeweils immer die
if($line =~ /$TEXTS[0]/) {
-Zeilen.
Ich wollte der Übersicht halber deshalb nicht den vollständigen Code posten. Deshalb hole ich das hier nach:

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
#!/usr/bin/perl -w

# ###################################################################
# lit_search1.pl
# Moes G. 2005
# ###################################################################

# The name of the results template
$tplfile="../httpdocs/results1.htm";

# ####################################################################

use CGI;
my $query = new CGI; # neues CGI-Objekt erzeugen

my $SEARCH = $query->param('text');
my @TEXTS = split(/\s+/, $SEARCH);
my @ALLURLS = $query->param('auswahl');
my $BOOL = $query->param('boolean');

my $text;
foreach $text (@TEXTS) {
if ($text eq "")
{
print "Content-type: text/html\n\n";
print "<html>\n";
print "<head>\n";
print "<title>Literatursuche</title>\n";
print "</head>\n";
print "<body>\n";
print "<script language=\"JavaScript\">\n";
print "{\n";
print "alert(\"Kein Suchtext angegeben\");\n";
print "history.back();\n";
print "}\n";
print "</script>\n";
print "</body></html>";
exit;
}
}

# Read the template
if (open(FILE,"$tplfile"))
{
@TEMPLATE = <FILE>;
close(FILE);
}
else
{
&error_open;
}

# Locates ##LOOP-START## and ##LOOP-END## in the template
$loopstart = 0;
$loopend = 0;
$tempsize=@TEMPLATE;
for($n=0; $n<$tempsize; $n++) {
$line=$TEMPLATE[$n];
if($line =~ /LOOP-STARTS/i) {
$loopstart=$n; }
if($line =~ /LOOP-ENDS/i) {
$loopend=$n; }
}


# print the top of the page
print "Content-type: text/html\n\n";
for($n=0; $n<$loopstart; $n++) {
$line=$TEMPLATE[$n];
print $line; }


# flags definition
$flag_any = 0;
$flag_page = 0;
$counter = 0;


@ALLURLS = $query->param('auswahl');

# Loops through all urls
for($n=0; $n<@ALLURLS; $n++) {
$flag_page=0;

# split between the URL and the file description
@PARTS = split(/\|/, $ALLURLS[$n]);

if (open(CONTENT_FILE,"$PARTS[0]"))
{
@CONTENT = <CONTENT_FILE>;
$all = @CONTENT;
close(CONTENT_FILE);
for($m=0; $m<@CONTENT && $flag_page <10000; $m++) {
$line=$CONTENT[$m];

# Remove html tags from $line
$line =~ s/<(.*?)>/\.\.\./g;

$i=1;
if ($BOOL eq 'oder'){
foreach $text (@TEXTS) {
if($line =~ /$text/){
# Highligt the text found
$line=~ s/$text/<b>$text<\/b>/g;

&result;

}
$i = $i++;
}

}

elsif ($BOOL eq 'und'){
if($line =~ /$TEXTS[0]/) {
if($line =~ /$TEXTS[1]/) {
if($line =~ /$TEXTS[2]/) {
if($line =~ /$TEXTS[3]/) {
if($line =~ /$TEXTS[4]/) {


# Highligt the text found

foreach $text (@TEXTS) {

$line=~ s/$text/<b>$text<\/b>/g;
}



&result;

$i = $i++;

}

}

}
}
}
}
}
}
else
{
&error_open;
}
}

# Prints the rest of the page
if ($flag_any == 0)
{
print "<div align=\"center\">";
print "<center>";
print "<table border=\"0\" cellpadding=\"0\" cellspacing=\"4\" width=\"70%\">";
print "<tr>";
print "<td width=\"100%\"><font color=\"#000080\" face=\"Arial\" size=\"2\">Kein passender Eintrag gefunden.</font></td>";
print "<\/tr>";
print "<\/table>";
print "<\/center>";
print "<\/div>";
}
for($n=$loopend; $n<$tempsize; $n++) {
$line=$TEMPLATE[$n];
$line =~ s/##QUERY##/$query/gi;
print $line; }
exit;

sub error_open
{
print "Content-type: text/html\n\n";
print "<html>\n";
print "<head>\n";
print "<title>Fehler!</title>\n";
print "</head>\n";
print "<body>\n";
print "<h1>";
print "Die Datei konnte nicht geöffnet werden oder wurde nicht gefunden.";
print "</h1><br>";
print "</body></html>";
exit;
}

sub result
{
$counter = $counter + 1;

# Prints this record looping throug the template
for($tpline=$loopstart; $tpline<$loopend && $flag_page == 0; $tpline++)
{
$linet=$TEMPLATE[$tpline];
$linet =~ s/##DESCRIPTION##/$PARTS[1]/gi;
$linet =~ s/##ALL##/$all /gi;
print $linet;
}
print "<td style = \"text-indent:-70pt; padding-left:70pt;\">";
print "<font face=\"Arial\" size=\"2\">";
print $line;
print"<br>";
print "<\/font>";
print "<\/td>";
print "<\/tr>";
$flag_page = $flag_page+1;
if ($flag_page == 2) {$counter--;}
$flag_any = 1;
}


Das HTML-Formular übergibt folgende Werte:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<form action="../cgi-bin/lit_search1.pl" method="post">
<select multiple="multiple" name="auswahl" size="4">
<option selected="selected"
value="./literatur/Literatur_Notizbuecher.txt|in Notizb&uuml;chern (Heft 1-67) ver&ouml;ffentlicht (Zusammenstellung: Spreter, R. 1996, Moes, G. 2005)">Notizb&uuml;cher</option>
<option
value="./literatur/Literatur_Mitglieder.txt|Ver&ouml;ffentlichungen von Mitgliedern ausserhalb der Notizb&uuml;cher (Zusammenstellung: Theiling, C., Moes, G. 2005)">Ver&ouml;ff.
v.
Mitgliedern&nbsp;&nbsp;</option>

<option
value="./literatur/Literatur_Huelbusch.txt|H&uuml;lbusch (Zusammenstellung B&ouml;se-Vetter, H. u. Sauerwein, B. 1996: erg&auml;nzt Moes, G. 2005)">H&uuml;lbusch</option>
<option
value="./literatur/Literatur_Baeume.txt|Literatur zur Baumpflege (Zusammenstellung: Moes, G. 2002)">B&auml;ume</option>
</select>
<input name="text" size="20" type="text"><br>
<input value="OK" type="submit">&nbsp;&nbsp;
<select name="boolean">
<option>und </option>

<option>oder </option>
</select>
</form>


in Aktion sehen kann man das Ganze unter
AG Freiraum und Vegetation

Such-Begriffe wie 'Wien' oder 'Bremen' funktionieren, nicht aber Suchen etwa mit 'Kassel', weil zuviele Antworten geliefert werden.

Gruß Georges
pq
 2005-07-17 19:43
#56473 #56473
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
erst mal als lektüre empfohlen:
Wiki:use strict
Wiki:Strings
Wiki:Templates
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
esskar
 2005-07-17 21:01
#56474 #56474
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
und danch kommst du wohl mit

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
my $allokay = 1;

my $idx = 0;
while($idx < 5 and $allokay) {
$allokay &&= $line =~ /$TEXTS[$idx]/;
}

if($allokay) {
foreach $text (@TEXTS) {
$line=~ s/$text/<b>$text<\/b>/g;
}
}


weiter
Georges
 2005-07-18 00:08
#56475 #56475
User since
2005-07-14
13 Artikel
BenutzerIn
[default_avatar]
Danke für die Hinweise pq,
ich habe den Code mit use strict; und use warnings;
ausgestattet, sämtliche Variablen deklariert, die häufigen print Anweisungen mit print <<XYZ ......XYZ zu Blöcken zusammengefasst.
es bleiben jetzt nur die eingangs beschiebenen Fehlermeldungen für die dort erwähnten Zeilen.

?????

Ich habe zwar einiges über die Lektüre und die Vereinfachung im Code dazugelernt, meine anfänglichen Probleme bestehen aber weiterhin.
Ich habe eben auch noch kein Beispiel gefunden, wie ich einfacher prüfen kann welche
$line alle Werte des Arrays @TEXTS enthält??

Vielleicht kann mir da mal jemand auf die Sprünge helfen.


Gruß Georges
esskar
 2005-07-18 00:11
#56476 #56476
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
emm... hast du mein snippet übersehen?
Georges
 2005-07-18 01:30
#56477 #56477
User since
2005-07-14
13 Artikel
BenutzerIn
[default_avatar]
Entschuldige, aber ich hatte deinen Beitrag über dem Schreiben meines eigenen übersehen.

Die Abfrage funktioniert bei mir nicht. Ich habe meine if..if..if..-Treppe durch deinen Code ersetzt, aber ich bekomme dann eine ungefilterte Ausgabe aller Zeilen, die ohne Hervorhebungen ist und zudem bei der Ausgabe hängen bleibt.

Werde also noch weiter suchen müssen.

Georges
esskar
 2005-07-18 02:43
#56478 #56478
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
stimmt;
sorry; hatte das ++ vergessen

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
my $allokay = 1;

my $idx = 0;
while($idx < 5 and $allokay) {
$allokay &&= $line =~ /$TEXTS[$idx++]/;
}

if($allokay) {
foreach $text (@TEXTS) {
$line=~ s/$text/<b>$text<\/b>/g;
}
}


versuchs jetzt nochmal!
Crian
 2005-07-18 18:09
#56479 #56479
User since
2003-08-04
5872 Artikel
ModeratorIn
[Homepage]
user image
[quote=pq,17.07.2005, 17:43]erst mal als lektüre empfohlen:
Wiki:use strict
Wiki:Strings
Wiki:Templates[/quote]
Wenn Du damit durch bist -> perldoc perlstyle
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
<< |< 1 2 >| >> 16 Einträge, 2 Seiten



View all threads created 2005-07-17 17:43.