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

Such-Script gesucht



<< |< 1 2 >| >> 16 Einträge, 2 Seiten
WOtAN
 2005-08-03 12:47
#5374 #5374
User since
2005-08-03
12 Artikel
BenutzerIn
[default_avatar]
Hallo.
Ich brauche dringend einen Script, der eine Datei durchsucht.
Der Script sollte 2 Sachen suchen können, ein einer datei.

Die Datei ist folgendermaßen beschaffen:
1. Zeile: ID
2. Zeile: Interpret
3. Zeile: Titel
4. Zeile: ID2
5. Zeile: Interpret2
6. Zeile: Titel2

So setzt sich die datei dann immer weiter fort...

Der Script soll nur nach dem Titel und Interpreten suchen, undwenn eine Übereinstimmung gegeben ist,die ID zurückgeben.

Ich habe selber zwar auch schon was programmiert, aber das hat nicht so richtig funktioniert.

Es wäre sehr sehr nett, wenn mir jemand helfen könnte.

MfG
WOtAN
Taulmarill
 2005-08-03 12:51
#5375 #5375
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
damit wir dir helfen können, solltest du erst einmal zeigen, was du bisher programmiert hast. wir helfen gerne, tun uns aber schwer damit anderen leuten ihre programme zu schreiben.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
renee
 2005-08-03 12:57
#5376 #5376
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Als Grundlage könntest Du folgendes machen...

Immer drei Zeilen zu einem String zusammenfassen und dann überprüfen, ob das gesuchte in dem String steckt, wenn ja, dann Ausgabe der ID...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
WOtAN
 2005-08-03 13:01
#5377 #5377
User since
2005-08-03
12 Artikel
BenutzerIn
[default_avatar]
Achja, Entschuldigung, hab ich vergessen ;)
Achja, ich bin totaler Neuling in Perl, desswegen nicht über den code wundern ;)

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
#!/usr/bin/perl
#
use CGI qw/:standard/;

$file = "lyrics.db";

$sinterpret = lc(param('interpret'));
$stitle = lc(param('title'));

print header;

print "Interpret::$sinterpret\n";
print "<BR>Title::$stitle<BR>\n";

open (SR, $file);

do
{
$rid = (<SR>);
$interpret = lc(<SR>);
$title = lc(<SR>);
$ci = 9;
$ct = 9;

if ($sinterpret ne "") {
do
{
++$i;
if (substr($interpret, $i, length($sinterpret)) = $sinterpret) {
$ci = 1;

}
else {
$ci = 9;
}
}
until ($i < length($interpret) or $ci = 1)
}
else {
$ci = 6;
}


if ($stitle ne "") {
if (length($stitle) <= length($title)) {
if ($stitle = $title) {
$ct = 1;
}
else {

for ($j = 0; $j < length($title); ++$j)
{
if (substr($title, $j, length($stitle)) = $stitle) {
$ct = 1;
}
else {
$ct = 9;
}
}
}
}
}
else {
$ct = 6;
}


# $ci / $ct Results:
#
# 9 - False
# 1 - True
# 6 - Empty

$a = $ci + $ct;

if ($a eq 7)
{
print "<BR> $rid matches - Variable returned : $a --------- $interpret - $title\n";
}

if ($a eq 2)
{
print "<BR> $rid matches - Variable returned : $a --------- $interpret - $title\n";
}

}
until (eof(SR))
renee
 2005-08-03 13:07
#5378 #5378
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ein paar allgemeine Tipps:

*) benutze use strict;
*) mache Fehlerbehandlung, also open(my $fh,"<$file") or die $!
*) innerhalb von if-Abfragen macht man keine Zuweisung, sondern überprüft einen Wahrheitswert. Um Zahlen zu vergleichen verwendet man ==, für Buchstaben und Zeichenketten eq. Also if($var eq 'string'){\n\n

<!--EDIT|renee|1123060212-->
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
WOtAN
 2005-08-03 13:18
#5379 #5379
User since
2005-08-03
12 Artikel
BenutzerIn
[default_avatar]
wenn ich use strict; mit reinschreibe, bekomm ich nur haufenweise fehlermeldungen...
Strat
 2005-08-03 13:29
#5380 #5380
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
wenn du use strict; und use warnings; verwendest, tust du dir beim fehlersuchen viel leichter. Auf meiner Homepage steht unter Vortraege meine Einfuehrung in Perl, da wird ein wenig dazu erklaert.

Code: (dl )
open (SR, $file);

kann es mal passieren, dass das oeffnen der Datei fehlschlaegt? Wenn man bei Befehlen, die nach aussen gehen, immer fehler abfragt, hat man gleich 90% weniger probleme.
Code: (dl )
open (SR, "<$file") or die "Error: couldn't open file '$file': $!\n";

oder
Code: (dl )
1
2
3
unless (open (SR, "<$file")) {
 die "Error: couldn't open file '$file': $!\n";
}


Ein CGI-Script wuerde ich folgendermaszen beginnen:
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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#! /usr/bin/perl
use warnings; # aktiviert die Warnungen, die oft hilfreich sind
use strict; # ueberprueft code strenger auf korrektheit, siehe meinen Vortrag
use CGI;

# hier werden fehler/warnungen im browser ausgegeben; das hilft
# sehr beim entwickeln, sollte aber, sobald alles laeuft, deaktiviert
# werden, um z.B. einem Hacker moeglichst wenig Infos zu geben:
use CGI::Carp qw(fatalsToBrowser warningsToBrowser);

# stellt die Variable $FindBin::Bin zur verfuegung; die enthaelt den
# pfad zum ausgefuehrten script, weil bei einem webserver
# nicht sichergestellt ist, dass er immer in das verzeichnis des
# scriptes wechselt, in dem das script liegt. Und durch 
# verwendung von FindBin wird das Script unabhaengiger von aussen
use FindBin;
my $file = "$FindBin::Bin/lyrics.db";

# neues CGI-Objekt erzeugen
my $cgi = CGI->new();

# http-header ausgeben:
print $cgi->header();

# parameter einlesen:
my $sinterpret = lc( $cgi->param('interpret') );
my $stitle     = lc( $cgi->param('title') );

# datei oeffnen:
unless (open (SR, "<$file")) {
  die "Error: couldn't open file '$file': $!";
} # unless

# einlesen:
while (my $rid = <SR>) {
  my $interpret = lc(<SR>);
  my $title = lc(<SR>);

  chomp($rid); chomp($interpret); chomp($title); # zeilenenden abschneiden

  # usw.

} # while

# datei schliessen
close (SR);
\n\n

<!--EDIT|Strat|1123061811-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Strat
 2005-08-03 13:34
#5381 #5381
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
nebenbei: mit index kannst du eine zeichenkette in einer anderen suchen, siehe perldoc -f index ... ich glaube, dann sparst du dir die inneren substr-schleifen
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
WOtAN
 2005-08-03 13:46
#5382 #5382
User since
2005-08-03
12 Artikel
BenutzerIn
[default_avatar]
Danke für eure Sehr gute und Schnelle Hilfe :)
Hab den Script jetzt zum laufen bekommen.
Danke.
WOtAN
 2005-08-03 14:22
#5383 #5383
User since
2005-08-03
12 Artikel
BenutzerIn
[default_avatar]
Ich hab doch noch ein Problem:
Wenn ichz.B. in der datei einen Titel hab, der Lautet "Das ist ein Test" findet der script Diesen Eintrag nur, wenn ich nach "Das" suche, aber bei "Test" findet er nichts.
Der Script durchsucht praktisch nur das erste Wort vor einem Leerzeichen.
Woran liegt das, und was kann ich machen?

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
#!/usr/bin/perl
#
use warnings;
use strict;
use CGI;

# hier werden fehler/warnungen im browser ausgegeben; das hilft
# sehr beim entwickeln, sollte aber, sobald alles laeuft, deaktiviert
# werden, um z.B. einem Hacker moeglichst wenig Infos zu geben:
use CGI::Carp qw(fatalsToBrowser warningsToBrowser);
use FindBin;

my $file = "$FindBin::Bin/lyrics.db";

my $cgi = CGI->new();

print $cgi->header();

my $sinterpret = lc( $cgi->param('interpret') );
my $stitle = lc( $cgi->param('title') );

print "Interpret::$sinterpret\n";
print "<BR>Title::$stitle<BR>\n";

unless (open (SR, "<$file")) {
die "Error: couldn't open file '$file': $!
";
}

while (my $rid = <SR>) {
my $interpret = lc(<SR>);
my $title = lc(<SR>);
my $ci = 27;
my $ct = 27;
chomp($rid); chomp($interpret); chomp($title); # zeilenenden abschneiden

if ($sinterpret ne '') {
if (index($interpret, $sinterpret) == 0) {
$ci = 1;
}
}
else {
$ci = 11;
}

if ($stitle ne '') {
if (index($title, $stitle) == 0) {
$ct = 1;
}
}
else {
$ct = 11;
}

my $a = $ci + $ct;

if ($a == 12) {
print '<br><p><a href="show.cgi?file=' . $rid . '">' . $interpret . ' - ' . $title . '</a></p>';
}

if ($a == 2) {
print '<br><p><a href="show.cgi?file=' . $rid . '">' . $interpret . ' - ' . $title . '</a></p>';
}

}
close (SR);
<< |< 1 2 >| >> 16 Einträge, 2 Seiten



View all threads created 2005-08-03 12:47.