Meine Suchroutine findet nur Dateiendungen !
Frank
- perl
Ich habe eine Suchroutine mit Perl programmiert, die nach Eingabe eines Verzeichnisses und eines Suchbegriffs sämtliche Unterverzeichnisse absucht und die Dateien ausgibt, die die Zeichenfolge enthalten.
Leider funktioniert es nur wenn ich eine Dateiendung (z.B. .txt) eingebe. Kann mir jemand sagen was ich falsch mache ?
Hier mein Script:
print "Nach welcher Zeichenfolge soll gesucht werden ?\n";
print "Wenn es sich um eine Dateiendung haelt, bitte den Punkt mit\n";
print "eingeben. (z.B. .txt)\n";
$Zeichenfolge = <STDIN>;
$Zeichenfolge =~ s/./\./i; #### Bereitet den Punkt so auf, daß er im regulären Ausdruck in Zeile 40 berücksichtigt wird. ####
print "\nWie heisst das Oberverzeichnis, dass durchsucht werden soll ?\n";
$Oberverzeichnis = <STDIN>;
if($Oberverzeichnis =~ /\n/)
{
chop($Oberverzeichnis);
}
else
{exit;}
if($Zeichenfolge =~ /\n/)
{chop($Zeichenfolge);}
else
{exit;}
&suche("$Oberverzeichnis", "$Zeichenfolge"); #### Aufrufen des Unterprogramms suche und übergabe der ####
#### Variablen $Oberverzeichnis und $Zeichenfolge. ####
sub suche
{
my $verzeichnis = shift;
my $begriff = shift;
opendir (DIR,$verzeichnis) print "Verzeichnis ", $verzeichnis, " gibt es nicht.\n";
foreach (readdir(DIR))
{
if ($_ eq '.' $_ eq '..')
{next;}
else
{$fullname="$verzeichnis\$_";}
if (-d "$fullname") #### -d prüft ob es sich bei dem File um ein Verzeichnis handelt ####
{
&suche("$fullname", "$begriff");
}
elsif ($fullname =~ /$Zeichenfolge/) {print $fullname, "\t\t\t", -s ($fullname), " Bytes\n";}
}
}
$Zeichenfolge =~ s/./\./i; #### Bereitet den Punkt so auf, daß er im regulären Ausdruck in Zeile 40 berücksichtigt wird. ####
Ich denke, das machst Du nicht.
Vielmehr fügst Du einen "" *irgendwo* ein.
Was Du vermutlich wirklich willst, ist:
$Zeichenfolge =~ s/./\./i;
das ersetzt dann "." durch ".".
Hi Michael !
Du hast recht ! Jetzt klappt es !
Aber kanst Du mir vielleicht noch sagen, was ich falsch gemacht habe ?
Wenn ich als Suchbegriff zum Beispiel self
eingegeben habe hat mein regulärer Ausdruck /.self
draus gemacht, obwohl gar kein Punkt in meiner Eingabe vorkam.
Kannst Du mir Deinen reg. Ausdruck vielleicht nochmal genau erklären ?
Danke
Frank
$Zeichenfolge =~ s/./\./i; #### Bereitet den Punkt so auf, daß er im regulären Ausdruck in Zeile 40 berücksichtigt wird. ####
Ich denke, das machst Du nicht.
Vielmehr fügst Du einen "" *irgendwo* ein.Was Du vermutlich wirklich willst, ist:
$Zeichenfolge =~ s/./\./i;
das ersetzt dann "." durch ".".
Wenn ich als Suchbegriff zum Beispiel
self
eingegeben habe hat mein regulärer Ausdruck/.self
draus gemacht, obwohl gar kein Punkt in meiner Eingabe vorkam.
Dein Ausdruck ersetzt das erste Zeichen (in der Suchzeichenkette ist "." eine wildcard) durch "." (denn in der Zielzeichenkette ist "." offenbar keine wildcard mehr).
Kannst Du mir Deinen reg. Ausdruck vielleicht nochmal genau erklären ?
Ich ersetze einen Punkt "." durch das, was in dem regulären Ausdruck später drin stehen soll, nämlich zuerst einem "", den ich hier aber escaped darstellen muß "\", und dann einem Punkt, den ich sicherheitshalber ebenfalls escaped dargestellt habe ".". Letzteres war vermutlich gar nicht nötig.
Dein Problem war, daß Du den Punkt auf der linken Seite nicht escaped hast. Deshalb machte der regular expression seinen Treffer auf ein beliebiges Zeichen gleich am Anfang der Zeichenkette und fügte "." deshalb ganz vorne ein.