It does seem very complicated :) Can't you just
use the Unix sort command to sort the files?
And I think you may have made a mistake when copying
your code into this post. What you have there doesn't
compile - it is missing a closing brace somewhere.
Update: I think there was a paste error
in the code. A large chunk of the code was repeated. He's
what I think the code should look like (Note: I've
reformatted it a bit, but haven't made any fixes yet)
#!/usr/local/bin/perl -w
use strict;
$| = 1;
use diagnostics;
####################################################################
## This file is designed to reorder the log files for the corporate
## web server. These log files will be sequentially ordered for
## faster parsing.
####################################################################
my $existingLogFile;
my $newLogFile = "$existingLogFile"."_sorted";
my $logdirs = "/data/sortlogs/";
my @unique;
my $counter = 0;
my @timestamps;
opendir (LOGDIR, $logdirs) or die "no $logdirs: $!";
while ($_ = readdir(LOGDIR)) {
if ($_ =~ /^access/) {
$existingLogFile = $_;
}
}
open (EXFILE, $existingLogFile)
or die "Could not open $existingLogFile $!";
while (<EXFILE>) {
if (/^\d/) {
chomp;
my ($begOfLog, $timeString, $endOfString) = split /[\[\]]/, $_;
push (@timestamps, $timeString);
}
}
close (EXFILE);
@timestamps = sort (@timestamps);
$unique[0] = $timestamps[0];
foreach my $stamp(@timestamps) {
unless ($stamp eq $unique[$counter]) {
push (@unique, $stamp);
$counter++;
}
}
foreach my $ts (@unique) {
open (SORTEDFILE, ">>$newLogFile")
or die "Could not open $newLogFile $!\n";
open (EXFILE, "+<$existingLogFile")
or die "Could not open $existingLogFile $!";
while (<EXFILE>) {
my ($before, $entryStamp, $after) = split /[\[\]]/, $_;
my $strippedEntry = tell(EXFILE);
if ($ts eq $entryStamp) {
print SORTEDFILE $_;
} else {
open (TEMPFILE, ">>/data/temp")
or die "Couldn't open temp file $!\n";
print TEMPFILE $_;
}
}
close (EXFILE);
close (SORTEDFILE);
close (TEMPFILE);
rename ("/data/temp",$existingLogFile);
}
--
<
http://www.dave.org.uk>
"The first rule of Perl club is you don't talk about
Perl club."
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.