shrawan
shrawan

Reputation: 47

redirect output files in different directory

I'm new to Perl and trying to put output files in a different directory.piece of code is as below

use File::Basename;
use File::Copy;
use File::Path; 

    foreach my $file (sort({uc($a) cmp uc($b)} keys(%$ch_ref))) {
        my $num = keys(%{$$ch_ref{$file}});
             print "\n     -> $string $file ($num):\n";
        foreach my $sid (keys(%{$$ch_ref{$file}})) {
            if ($type == $PRINT_OLD) {
                open ( my $output, '>>',$file );
                        print {$output} "  something";
                close ( $output ) or die $!;
            } 

Upvotes: 1

Views: 411

Answers (1)

Dave Cross
Dave Cross

Reputation: 69224

The third argument to open() is the full path to the file that you want to open. Currently, you're just giving it the filename. but you can expand that to include the directory as well.

Something like this:

my $dir = '/path/to/some/directory';

open my $output, '>>', $dir . $string . '_' . $file;

You should really be checking the success of the open() call, and it's a bit easier to give a sensible error message if you build the filename into a variable first.

my $dir = '/path/to/some/directory';
my $filename = "$dir${string}_$file";

open my $output, '>>', $filename
  or die "Can't open $filename: $!";

Note that using ${string} instead of $string means that you can use it directly in the string without the name getting tangled up with the following _ character.

I'd also strongly recommend dropping your use of prototypes on your subroutine. Perl prototypes are often far more trouble than they are worth.

Also, there's no need to open() and close() your file so many times. Just open it at the top of the loop (it will be automatically closed at the end as $output goes out of scope).

Upvotes: 2

Related Questions