in reply to help merging perl code routines together for file processing
Well both scripts are simple enough to include the second one inside the while loop of the first one, something like this:
# from second file use strict; use Digest::MD5 qw(md5_hex); # from first file my $target_dir = "/backups/test/"; opendir my $dh, $target_dir or die "can't opendir $target_dir: $!"; while (defined(my $file = readdir($dh))) { next if ($file =~ /^\.+$/); #Get filename attributes if ($file =~ /^foo(\d{3})\.name\.(\w{3})-foo_p(\d{1,4})\.\d+.csv$/ +) { print "$1\n"; print "$2\n"; print "$3\n"; } print "$file\n"; # From second file #Create new file open (NEWFILE, ">/backups/processed/foo$1.name.$2-foo_p$3.out") || die "cannot create file"; my $data = ''; my $line1 = <>; chomp $line1; my @heading = split /,/, $line1; my ($sep1, $sep2, $eorec) = ( "^A", "^E", "^D"); while (<>) { my $digest = md5_hex($data); chomp; my (@values) = split /,/; my $extra = "__mykey__$sep1$digest$sep2" ; $extra .= "$heading[$_]$sep1$values[$_]$sep2" for (0..scalar(@ +values)); $data .= "$extra$eorec"; print NEWFILE "$data"; } #print $data; close (NEWFILE); # and back to the first file }
Note: I didn't change anything except moved a couple of blocks of code (marked) and changed the indentation (should be clear enough). You'll have to make any fixes.
Rather than that, though, I think I'd just make the second script a subroutine, and call it from the first script. Again, something like the following. (Again, I'm not changing anything, just arranging stuff.):
# from second script use strict; use Digest::MD5 qw(md5_hex); # from first script my $target_dir = "/backups/test/"; opendir my $dh, $target_dir or die "can't opendir $target_dir: $!"; while (defined(my $file = readdir($dh))) { next if ($file =~ /^\.+$/); #Get filename attributes if ($file =~ /^foo(\d{3})\.name\.(\w{3})-foo_p(\d{1,4})\.\d+.csv$/ +) { print "$1\n"; print "$2\n"; print "$3\n"; } print "$file\n"; # New line added: call the routine to process file process_file($file); } # New line: tell perl that we're making a subroutine sub process_file { # Need to get arguments here: my ($filename) = @_; # from second script #Create new file open (NEWFILE, ">/backups/processed/foo$1.name.$2-foo_p$3.out") || die "cannot create file"; my $data = ''; my $line1 = <>; chomp $line1; my @heading = split /,/, $line1; my ($sep1, $sep2, $eorec) = ( "^A", "^E", "^D"); while (<>) { my $digest = md5_hex($data); chomp; my (@values) = split /,/; my $extra = "__mykey__$sep1$digest$sep2" ; $extra .= "$heading[$_]$sep1$values[$_]$sep2" for (0..scalar(@ +values)); $data .= "$extra$eorec"; print NEWFILE "$data"; } #print $data; close (NEWFILE); }
Oh, yes, you asked for some best practice suggestions, too. The only ones that jump out at me are:
it has the advantage of being safer. In some cases (such as the one here the filename can be executed by the operating system. If the string is provided by the user, they could cause you some serious problems. With the three argument form, you're safe from that: perl treats the string as a filename and doesn't try to execute it.open (NEWFILE, ">", "/backups/processed/foo$1.name.$2-foo_p$3.out" +)
open NEWFILE, ">", "/backups/processed/foo$1.name.$2-foo_p$3.out" or die "cannot create file";
Update: Added readmore tags and best practice suggestions.
Is this the kind of suggestion you were seeking?
...roboticus
When your only tool is a hammer, all problems look like your thumb.
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: help merging perl code routines together for file processing
by JaeDre619 (Acolyte) on Feb 20, 2011 at 00:30 UTC | |
|
Re^2: help merging perl code routines together for file processing
by JaeDre619 (Acolyte) on Feb 20, 2011 at 05:16 UTC | |
by roboticus (Chancellor) on Feb 20, 2011 at 07:30 UTC | |
by JaeDre619 (Acolyte) on Feb 21, 2011 at 00:25 UTC |