Jenda Krynicky wrote:
> 
> From: "John W. Krahn" <[EMAIL PROTECTED]>
> >
> > perl
> > -lane'eof||m!^\d{4}/\d\d/\d\d\s+\d\d:\d\d:\d\d\s!?((@X&&print"@X"),@X=
> > @F):push@X,@F' logfiles*
> 
> Wow :-)
> 
> It's very short and all, but ... not very readable :-)
> 
> Let's write it as an ordinary program:
> 
> #!perl -w
> use strict;
> 
> sub CleanupLog {
>     my ($from_file, $to_file) = @_;
>     open my $IN, '< ' . $from_file

Since you are using lexically scoped file handles we can also use the
three argument form of open.

     open my $IN, '<', $from_file


>         or die "Can't open file $from_file : $!\n";
>     open my $OUT, '> ' . $to_file
>         or die "Can't create file $to_file : $!\n";
>     my $line = '';
>     while (<$IN>) {
>         chomp; # get rid of the newline
>         next if $_ eq ''; # skip empty lines

What happens if $_ eq '   '?


>         s/\s{2,}/ /g; # replace 2 or more whitespace chars
>                       # with a single space

Or simply:

          s/\s+/ /g;

Or for speed:

          tr/ \t\r\n\f/ /s;


>         if ( m{^\d{4}/\d{2}/\d{2} \d\d:\d\d:\d\d} ) {
>                       # if the current line starts with a timestamp ...
>                       # I assume the YYYY/MM/DD HH:MI:SS format
>             print OUT $line, "\n" if $line;
                    ^^^
Unknown file handle?


>                       # print the buffer
>             $line = $_;
>                       # remember the current line
>         } else {
>             $line .= ' ' . $_;
>                       # add the current line to the buffer
>         }
>     }
>     print $OUT $line, "\n" if $line;
>             # print the last buffer
>     close $IN;
>     close $OUT;
> }

A more exact translation would be:

sub CleanupLog {
    my ( $from_file, $to_file ) = @_;
    open my $IN,  '<', $from_file or die "Cannot open file $from_file:
$!";
    open my $OUT, '>', $to_file   or die "Cannot create file $to_file:
$!";
    my @output;
    while ( <$IN> ) {
        my @line = split; # removes ALL whitespace
        if ( m!^\d{4}/\d\d/\d\d\s+\d\d:\d\d:\d\d\s! ) {
            print $OUT "@output\n" if @output;
            @output = @line;
            }
        else {
            push @output, @line;
            }
        }
    print $OUT "@output\n" if @output;
    close $IN;
    close $OUT;
    }


> # now let's process all .log files in the current directory and
> # write the results to 'Cleaned' subdirectory
> mkdir 'Cleaned', 0777 unless -d 'Cleaned';
> opendir my $DIR, '.';

You should _always_ verify that the directory was opened.

opendir my $DIR, '.' or die "Cannot opendir '.': $!";


> while (defined(my $file = readdir $DIR)) {
>     next unless $file =~ /\.log$/i;
>             # skipp all files that do not end with '.log'
>     next if -d $file; # skip directories
>     print "$file\n";
>     CleanupLog $file, 'Cleaned/'.$file;
> }
> closedir $DIR;
> __END__
> 
> Of course you'll have to read some introductory docs to be able to
> modify this to fit better to your needs, but this should give you a
> start.



John
-- 
use Perl;
program
fulfillment

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to