Ich erstelle ein Skript, das ich in einem bestimmten Ordner öffne, der zwei verschiedene Dateitypen enthält. 'Sichere' (secure.text, secure.001.text usw.) Dateien und 'message' (message.txt, etc) Dateien. Jede Datei enthält ein Protokoll für Jahr, Tag, Datum, Stunde und Minute. Ich möchte in der Lage sein, diese Dateien zu scannen und eine neue Datei zu erstellen, die alle Protokolleinträge für Januar 2006 enthält. Der Zweck dieses Skripts ist es, nur einen Satz von Daten (sicher) und nicht alles (nur) zu scannen (Mitteilungen).Skript, um den Ordner zu scannen, in dem sich das Skript befindet, und nach bestimmten Dateien zu suchen [Perl]
Ich habe Probleme mit meinem Skript finden das aktuelle Arbeitsverzeichnis. Zu meinem Verständnis verwendet Perl den Ort des Skripts als aktuelles Verzeichnis. Ich benutze die opendir und closedir Funktionen, und werde aufgefordert, dass es 60 Dateien innerhalb des Verzeichnisses des Skripts gibt, aber wenn ich einige Dateien lösche, nur um es zu testen, sagt es immer noch 60, was mich zu der Annahme verleitet, dass dies nicht die Aktuelles Verzeichnis. Es findet auch nicht "sicher", trotz der richtigen Regex.
Die Ausgabe, die ich erhalte, ist "Problem, Datei 'sicher' zu finden."
#!/usr/bin/perl
use strict;
use warnings;
#Locate and scan all of the files
#list all files in same dir as this perl script.
my $dirname = ".";
opendir(my $dh, $dirname) #sets $dh as the current working directory
or die "Can't open dir '$dirname':$!\n"; #Kills if can not open current directory.
my @all_the_file; #Instantiates new variable that accounts for all of the files in the current dir.
while(my $file = readdir($dh)) { #$file accounts for every file on device.
push(@all_the_file, $file); #Pushes files in current directory to $file.
}
closedir($dh);
#Gets all of the secure files.
my @all_the_secure_file;
@all_the_secure_file = grep(/^secure(\.\d{1,2})?$/, @all_the_file);
#Itterate over secure files.
my $filename = "secure";
open(my $fhin, "<", $filename)
or die "Can't open '$filename':$!\n";
chomp(my @lines = <$fhin>) ;
close($fhin);
#Match the Regex of Jan.
my @jan_lines = grep(/^Jan/ , @lines) ;
print "The file '$filename' = " . @lines . " lines.\n";
print "Size of \@jan_lines = " . @jan_lines . "\n";
#Print and create new file with Data.
my $filename2 = "secure.1";
open(my $fhin, "<", $filename)
or die "Can't open '$filename':$!\n";
chomp(my @lines2 = <$fhin>) ;
close($fhin);
my @jan_lines2 = grep(/^Jan/ , @lines2) ;
print "The file '$filename2' = " . @lines2 . " lines.\n";
print "Size of \@jan_lines2 = " . @jan_lines2 . "\n";
exit;
Die Lage des Skripts ist nicht unbedingt das aktuelle Arbeitsverzeichnis. Das aktuelle Arbeitsverzeichnis ist das aktuelle Arbeitsverzeichnis. Schauen Sie sich zum Beispiel die Module [Cwd] (http://perldoc.perl.org/Cwd.html) und [FindBin] (http://perldoc.perl.org/FindBin.html) an. –
Auch "über sichere Dateien iterieren" und "neue Datei mit Daten drucken und erstellen" tun eigentlich nicht, was die Kommentare sagen, sie tun ... –
Basic Debugging: (1) Set $ Dirname auf den tatsächlichen Pfad (hard-code es) (2) Was du von "opendir" bekommst, hat den Pfad nicht! Setzen Sie also '$ dirname' auf was 'opendir' zurückgibt. // Dann scannen Sie Dateien in diesem '$ dirname'. // Bitte lies keine Dateien _ zum Testen! Warum drucken Sie sie nicht einfach auf den Bildschirm und prüfen, ob sie korrekt sind? Denken Sie daran, sie müssen den vollständigen Pfad haben. Sie können auch mit 'if (nicht -f $ datei) {print" No $ file \ n "}' testen und sehen, ob diese _strings_ (Name '$ file') tatsächliche Dateien auf dem System sind. // Es gibt andere Probleme, aber das ist ein Anfang. – zdim