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

Zeichenkette in Datei suchen



<< >> 4 Einträge, 1 Seite
dschingis
 2007-10-15 13:27
#100825 #100825
User since
2007-10-15
5 Artikel
BenutzerIn
[default_avatar]
Zum ersten Posting erstmal ein HALLO an alle!!!

Ich bin recht neu im Thema Programierung, brauche dies allerdings um mir das eine oder andere der täglichen Arbeit zu erleichtern. Aus diesem Grund binich jetzt hier gelandet um ein wenig Hilfe zu bekommen.

Ich möchte in einer Datei eine bestimmte Zeichenkette suchen. Wird diese gefunden soll er mir ein true geben, sonnst ein false.
Ich hab mir ein Grundgerüst gebaut mit dem ich dies machen will, aber irgendwie klappt das nicht, bzw. mir fehlt noch etwas Grundwissen um es auf die Reihe zu bekommen.

Hier mal mein Anfang:

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

# Suchdatei
$logfile = "/root/install.log";

# Suchstrings
$esx301 = "Installing VMware-esx-3.0.1-32039.i386.";
$esx302 = "Installing VMware-esx-3.0.2-52542.i386.";
$centOS = "centos-release - 10:5-0.0.el5.centos.2.i386 installieren";

#Suchdatei oeffnen und in Array kopieren
open(HANDLE,"<$logfile") or die "Die Datei $logfile konnte nicht geoeffnet werden! Fehler: $!";
@file=<HANDLE>;
close(HANDLE) or die "Die Datei $logfile konnte nicht geoeffnet werden! Fehler: $!";

#Zeilenweiser Vergleich nach Suchstring
        chomp(@file);
        foreach $line (@file)
        {
                if((chomp($line)) = $esx301)
                {
                        print "ESX 3.0.1 gefunden";
                }
                elsif((chomp($line)) = $esx302)
                {
                        print "ESX 3.0.2 gefunden";
                }
                elsif((chomp($line)) = $centOS)
                {
                        print "CentOS gefunden";
                }
                else
                {
                        print "Keine gueltige OS Version gefunden!!!"
                }
        }


Mein Gedankengang:
Er soll zeilenweise durch die eingelesene Datei suchen.
Findet er den ersten String, soll die erste ausgabe erfolgen.
Findet er den zweiten String, soll die zweite Ausgabe erfolgen. ...
Findet er nichts davon, soll er die letzte Ausgabe machen und beenden.
Die letzte Ausgabe soll allerdings erst kommen wenn er die Datei (das Array) fertig durchsucht hat und keine Zeile mehr übrig ist ... wäre wünschenswert.

Kann mir hier mal jemand einen Gedankenanstoß geben um mich auf die Richtige Spur zu bringen?
Ihr sollt mir das ja nicht schreiben, nur ein paar Tipps das ich richtig suche ... ich will ja was dabei lernen!

Gruß und Danke
Dschingis
Antworten mit Zitat
Strat
 2007-10-15 14:00
#100834 #100834
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ich wuerde das ganze folgendermaszen schreiben:

1. warnings und strict verwenden; hilft enorm bei der Fehlersuche und macht perl in meinen Augen erst verwendbar. Warum? Siehe http://www.fabiani.net/ -> Vortraege -> Einfuehrung in Perl -> Die Zaehmung des Kamels

2. nicht alles einlesen, sondern nur Zeile fuer Zeile. Sowas ist gerade bei grossen Dateien um einiges schneller, weil es RAM spart. Und keinen globalen Filehandle verwenden, sondern einen lokalen; das macht das Programm von aussen unabhaengiger.

3. = ist kein Vergleich, sondern eine Zuweisung. Wenn du vergleichen willst, dann mit == fuer numerischen Kontext oder eq fuer String-Kontext (also in deinem Fall eq)

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

# Suchdatei
my $logfile = "/root/install.log";

# Suchstrings
my $esx301 = "Installing VMware-esx-3.0.1-32039.i386.";
my $esx302 = "Installing VMware-esx-3.0.2-52542.i386.";
my $centOS = "centos-release - 10:5-0.0.el5.centos.2.i386 installieren";

#Suchdatei oeffnen und in Array kopieren: 2
open( my $HANDLE, '<', $logfile)
    or die "Die Datei $logfile konnte nicht geoeffnet werden! Fehler: $!";

while( my $line = <$HANDLE> ) { # nur immer 1 Zeile im RAM lesen
    chomp $line;

    if( $line eq $esx301 ) { # 3
        print "ESX 3.0.1 gefunden\n";
    }
    elsif( $line eq $esx302 ) { # 3
        print "ESX 3.0.2 gefunden";
    }
    elsif( $line eq $centOS) { # 3
        print "CentOS gefunden";
    }
    else {
        print "Keine gueltige OS Version gefunden!!!"
    }

} # while

close $HANDLE
    or die "Die Datei $logfile konnte nicht geschlossen werden! Fehler: $!";
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Antworten mit Zitat
pq
 2007-10-15 14:19
#100838 #100838
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
toll, jetzt haben wir mehrere offene threads dazu.
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
Antworten mit Zitat
pq
 2007-10-15 14:49
#100842 #100842
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
bitte hier weiterschreiben: http://board.perl-community.de/thread/10575/
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
Antworten mit Zitat
<< >> 4 Einträge, 1 Seite



View all threads created 2007-10-15 13:27.