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

Dateien nach String durchsuchen

Leser: 3


<< >> 4 Einträge, 1 Seite
Monk
 2008-06-05 02:03
#110743 #110743
User since
2008-05-20
3 Artikel
BenutzerIn
[default_avatar]
Guten Abend,
ich habe da ein kleines Problem.
Ich möchte eine Suchfunktion programmieren und habe auch schon etwas rumprobiert.
Also es geht um folgendes:

Ich habe in einem Ordner mehrere .txt Dateien mit Inhalt.
Beispiel :
1.txt besitzt den Inhalt "ich bin beschreibung nummer1"
2.txt besitzt den Inhalt "ich bin beschreibung NUMMER2"
3.txt besitzt den Inhalt "ICH BIN BESCHREIBUNG NUMMER3"

So. Ich möchte nun in meinem PerlScript ein Suchwort eingeben, und es sollen daraufhin alle inhalte angezeigt werden, wo das Suchwort gefunden wurde.

Zb: Ich gebe ein "ich" und der text aller 3 dateien wird angezeigt.
Wenn ich "nummer2" eingebe soll halt nur der Inhalt aus 2.txt angezeigt werden.

Hier mal mein VersuchsCode:



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
#!/usr/bin/perl

$suche = "nummer"; 

@list = "";
foreach $file (glob("*.txt"))
{
open(READ,"$file") || "Fehler beim oeffnen";
push (@list,<READ>);
close(READ);
}

$count = "";

foreach $movie ("@list")
{
$count++;
        if ($movie=~ /$suche/i)
        { 
        print "Gefunden : ","@list[$count]";
        }
        else
        {
        print "Nix gefunden";
        }
}


Wäre nett wenn mir jemand erklärt wie ich das machen könnte, denn das Script funktioniert nicht richtig.
Wenn ich "nummer2" eingebe kommt auch der text mit nummer2, aber wenn ich zb "beschreibung" eingebe kommt NUR der Text aus 2.txt. ka wieso :(

Mit freundlichem Gruß

Monk
Gast Gast
 2008-06-05 07:48
#110745 #110745
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#!/usr/bin/perl
## bitte immer strict und warnings nutzen:
use strict;
use warnings;

## wenn man "strict" nutzt,
## muß man alle Variablen mit "my" initialisiern
my $suche = "nummer2";

##das ist falsch: 
# @list = "";
## so muß man das schreiben
# my @list = ();
## oder einfach
my @list;

foreach my $file (glob("*.txt"))
{
  ## bitte "|| die" nicht nur "||" das funktioniert nicht!
  ## beim öffnen kann man auch ausgeben lassen,
  ## was genau falsch gelaufen ist.
  ## bitte das das "open" mit den drei Werten nutzen 
  open(READ,'<',$file) || die "Fehler beim oeffnen ($!)";
  push (@list,<READ>);
  close(READ);
}

## $count soll doch eine Zahl sein oder?
## perl ändert das zwar automatisch,
## aber schön ist das nicht.
#$count = "";
my $count=0;

## nicht @list nicht in Anfühungszeichen!!!
## sonst fügst du die Einträge der Liste als String zusammen! 
foreach my $movie (@list)
{
  $count++;
  if ($movie =~/$suche/i)
  { 
    ## die Ausgabe ist etwas umständlich
    ## und zudem noch falch.
    ## auf ein Array greift man mit $list[$count] zu
    # print "Gefunden : ","@list[$count]";
    ## die Zeile steht doch schon in $movie.
    ## zudem ist die Ausgabe immer,
    ## da der erste Eintrag in der liste in $liste[0]
    ## $count hats du aber schon um eins erhöt,
    ## und ist für die erste Zeile 1 nicht 0 wie es richtig wäre.
    ## daher dein Probleme.
    ## allso entweder:
    # print "Gefunden : $liste[$count]\n";
    ## oder
    print "Gefunden: $movie\n";
  }
  else
  {
    ## Ist dir nie aufgefallen das die Ausgabe ohne newlines war?
    ## und das es insgesammt nie drei Ausgaben waren?
    print "Nix gefunden\n";
  }
}
Monk
 2008-06-05 13:16
#110757 #110757
User since
2008-05-20
3 Artikel
BenutzerIn
[default_avatar]
Vielen Dank für deine Verbesserung & für die Beschreibung :) Bin erst seit ca 2 Monaten PerlMonk ;).

MFG
Strat
 2008-06-05 15:54
#110775 #110775
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
Gast+2008-06-05 05:48:02--
Code (perl): (dl )
  open(READ,'<',$file) || die "Fehler beim oeffnen ($!)";

x) 'or' anstelle von '||' ist in meinen Augen besser lesbar.
x) Bei Fehlermeldungen hilft es manchmal, wenn man gesagt bekommt, bei welcher Datei das Lesen fehlschlägt:
x) lokale Filehandles sind meist sicherer, weil man sich nicht darum kümmern braucht, ob es außerhalb irgendwelche handles mit demselben Namen gibt:

Code (perl): (dl )
1
2
3
  open( my $READ, '<', $file ) or die "Fehler beim oeffnen von Datei '$file' ($!), died at";
 push( @lines, <$READ> );
 close( $READ );


Gast+2008-06-05 05:48:02--
Code (perl): (dl )
  if ($movie =~/$suche/i)

Sowas kann ziemlich fehlschlagen (und zwar zur Laufzeit), z.B. wenn $suche eine öffnende Klammer enthält, oder sonstige Zeichen, die in einer RE Sonderbedeutungen haben. Deshalb den String entweder escapen:
Code (perl): (dl )
  if ($movie =~/\Q$suche\E/i)

oder $suche gleich als RE speichern:
Code (perl): (dl )
my $suche = qr(irgendwas);

perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< >> 4 Einträge, 1 Seite



View all threads created 2008-06-05 02:03.