I think you want something like that:
use warnings; use strict; my $filename = $ARGV[0]; #$filename = 'robocopy_log.txt'; open my $hin, '<', $filename or die "Cannot open file /$filename/"; my @fcont = <$hin>; my ( $dir, $txt, $nbytes, $file_found, $sav_dir, $sav_file ); foreach my $line (@fcont) { if ( $line =~ /New File|New Dir/ ) { ($dir) = $line =~ /New Dir\s+(?:[0-9]+|[0-9]+?\.[0-9]+? +\s[a-z])\s(.*)/; ($file_found) = $line =~ /New File\s+(?:[0-9]+|[0-9]+?\.[0-9]+ +?\s[a-z])\s(.*?)\s+?/; ( $txt, $nbytes ) = $line =~ /(New File|New Dir)\s+([0-9]+|[0- +9]+?\.[0-9]+?\s[a-z])\s.*/; $sav_dir = $dir if $dir; $sav_file = $file_found if $file_found; $sav_dir = !defined $sav_dir ? q{} : $sav_dir; $sav_file = !defined $sav_file ? q{} : $sav_file; print join( "\t\t", $txt, $sav_dir, $nbytes, $sav_file ) . "\n +"; } } close $hin;
Also look at this example, how to avoid $1, $2, ... matching parameters, you can directly assing the result to a list of variables
You also can try to put the three assignments in ony line, this is left as an exercise ;-)
In reply to Re^3: Robocopy log parsing
by Anonymous Monk
in thread Robocopy log parsing
by bit5nip3r
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |