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

alle Dateien eines Ordners nach String durchsuchen

Leser: 1


<< |< 1 2 >| >> 11 Einträge, 2 Seiten
Gast Gast
 2005-07-22 13:38
#56612 #56612
Hi!

Ich wollte alle Dateien eines Ordners einlesen, um danach diese Dateien nach einem bestimmten String zu durchsuchen. Alle Dateien, die diesen String nicht beinhalten, sollen ausgeben werden. Als Perl Anfänger, hab ich diese Geschichte,sehr umständlich gelöst. Würde mich mal interessieren, wieviele Zeilen es sind,wenn man es perfekt macht !?
Hier mein Code:

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
my $dir = 'c:\Ordner;

opendir(DH, $dir) or die "Oeffnen des Ordners fehlgeschlagen";
@dateien = readdir(DH);
closedir(DH);

foreach my $datei (@dateien)
{
 open (Inhalt,"<","$datei");

 
 my $Status = 0;
 foreach (<Inhalt>)
 {
   if ($_ !~ /logging/ )
   {
   }
   else
   {
    $Status = 1;
   }
 }
 
 if ($Status == 0)
 {
   print $datei."\n";
 }
   
 close (Inhalt);

}



Und nun haut rein :-)

edit pq: code-tags hinzugefügt\n\n

<!--EDIT|pq|1122031449-->
Ronnie
 2005-07-22 13:55
#56613 #56613
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Code: (dl )
1
2
3
4
5
6
foreach my $datei (@dateien)
{
open (Inhalt,"<","$datei");
print $datei."\n" if grep {/logging/} <Inhalt>;
close (Inhalt);
}
Thorium
 2005-07-22 13:57
#56614 #56614
User since
2003-08-04
232 Artikel
BenutzerIn
[Homepage] [default_avatar]
Eine Möglichkeit wäre:

Code: (dl )
1
2
3
4
5
6
foreach my $datei (@dateien)
{
open (Inhalt,"< $datei");
print "$datei\n" unless grep { /logging/ } <Inhalt>;
close (Inhalt);
}

Gibt aber sicher noch andere...

EDIT:
Hehe Ronnie: Warst zwar schneller, aber hast die Aufgabenstellung nicht richtig gelesen :p\n\n

<!--EDIT|Thorium|1122026340-->
Per|li|nist der; -en, -en <zu ↑...ist>: a) Anhänger, Vertreter der radikalen Perlinisten die Perl als die einzig wahre Sprache ansehen; b) Mitglied einer perlinistischen Community.
Ronnie
 2005-07-22 14:00
#56615 #56615
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
@thorium: passiert ;)
Thorium
 2005-07-22 14:15
#56616 #56616
User since
2003-08-04
232 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=Guest,22.07.2005, 11:38][/quote]
So Stefan... um dir mal einwenig mehr zu Helfen, hab ich hier mal ein paar Tipps für dich

Benutze immer, wenn dus noch nicht getan hast
Code: (dl )
1
2
3
4
use strict;
use warnings;
# Eventuell:
use diagnostics;


Code: (dl )
my $dir = 'c:\Ordner;

Dateipfadangaben kannst du in Perl immer mit einem Vorwärtsslash darstellen - damit stolperst du nicht, wenn du doppelte Anführungszeichen benutzt und es ist auch noch Plattformübergreiffend

Code: (dl )
open (Inhalt,"<","$datei");

open solltest du immer mit einem "or die" belegen - bzw. immer die Fehlermeldung abfangen, wie du es schon bei opendir getan hast.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
 foreach (<Inhalt>)  {
if ($_ !~ /logging/ ) {
}
else {
$Status = 1;
}
}

if ($Status == 0) {
print $datei."\n";
}


Was du hier tust ist, du gehst durch jede einzelne Zeile, schaust, ob logging nicht vorkommt und setzt dann andernfalls den Status. Setz doch den Status einfach, wenn es vorkommt:

Code: (dl )
1
2
3
if ($_ =~ /logging/) {
$Status = 1;
}


Was du auch noch machen kannst ist, dass du die Schleife abbrichst sobald du das Wort gefunden hast. Weil es ist ja schon beim ersten match klar, dass du die Datei nicht aufführen wirst. Aus einer Schleife springst du mit last;

Code: (dl )
1
2
3
4
5
6
foreach (<Inhalt>) {
if (/logging/) {
$Status = 1;
last;
}
}


Wie du siehst, kannst dir das "$_ =~" sparen wenn du willst. Wenn dir aber daran liegt, dass dein Script auch für nicht perl-leiirte lesbar ist, vermeide wenn Möglich $_ - auch wenns praktisch ist.

Die ganze Prozedur, dass du Zeile für Zeile liest kannst du auch umgehen indem du dem regulären Ausdruck sagst, dass er den ganzen Text als eine Zeile behandeln soll.

Code: (dl )
1
2
open (Inhalt,"< $datei") or die $!;
print "$datei\n" unless join('', <Inhalt>) =~ m~logging~s;


Je nachdem kannst du 's' auch weglassen. (s sagt eigentlich dem "." einfach, dass er auch \n matchen soll).
So jetzt geh ich aber was essen... :p
Per|li|nist der; -en, -en <zu ↑...ist>: a) Anhänger, Vertreter der radikalen Perlinisten die Perl als die einzig wahre Sprache ansehen; b) Mitglied einer perlinistischen Community.
polkana
 2005-07-22 14:16
#56617 #56617
User since
2004-06-18
74 Artikel
BenutzerIn
[Homepage] [default_avatar]
Wenn Server UNIX System wie FreeBSD ist, dann kann das so gemacht werden
Code: (dl )
1
2
3
open(CONTENT, "/usr/bin/grep -R $string_was_ich_suche $path_wo_ich_suche|");
my @content = <CONTENT>;
close(CONTENT);

und dann alles aus Array @content mit foreach() kann man lesen oder direct mit while() machen;

Code: (dl )
-R

man kann wegschmeisen wenn ist nicht gebraucht die Datei weiter als ein Ordner suchen.\n\n

<!--EDIT|polkana|1122027935-->
J-jayz-Z
 2005-07-22 20:45
#56618 #56618
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
@polkana: na ja, er kann sich eigentlich auch gleich ein shellscript schreiben, oder ein tool in C/C++...
Aber er hatte ja auch mit Perl angefangen, dann kann er ja auch mit Perl weitermachen, oder?
Noch dazu hat Unix (meiner Erkentniss nach :p ) andere Verzeichnisstrujturen, wie c:\bla ... ^^
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
J-jayz-Z
 2005-07-22 21:32
#56619 #56619
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ich hätte es wohl so gemacht:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/perl
use strict;
use warnings;

opendir(DIR, 'c:\Ordner');

map {
print $_ . "\n" unless /logging/;
} (readdir(DIR));

closedir(DIR);

Aber es geht wohl beides. Und beinhaltet wohl beides Funktionen, die unter newbies nicht sehr weit verbreitet sind, die es sich aber lohnt mal genauer anzuschauen (map und grep).
perldoc -f grep
perldoc -f map
wenn du die scripte nicht ganz verstehst.


EDIT: if $_ !~ /bla/ in unless /bla/ geändert...
Mitdenken sollte man ^^\n\n

<!--EDIT|J-jayz-Z|1122053943-->
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
renee
 2005-07-23 01:20
#56620 #56620
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Das ist nicht ganz korrekt. Du schaust jetzt nur, ob in dem Dateinamen logging vorkommt, aber so wie es der OP geschrieben hat, soll geprüft werden, ob es im Dateiinhalt vorkommt!
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/
J-jayz-Z
 2005-07-23 16:25
#56621 #56621
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
Okay, mein Fehler.
Hät richtig lesen sollen...
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
<< |< 1 2 >| >> 11 Einträge, 2 Seiten



View all threads created 2005-07-22 13:38.