selami
selami

Reputation: 89

How can I access all sub-folders in the current working directory using perl?

I am trying to access all sub-folders in the current working directory. And then I want to run a program in each sub-folder. How can I do this? My code gave the following error:

Too many arguments for glob at ./analysis.pl line 13, near ""08")" BEGIN not safe after errors--compilation aborted at ./analysis.pl line 13.

#!/usr/bin/perl 
use File::chdir;
use strict;
use warnings;
use Cwd;

# current working directory
my $dir = cwd();

# subfolders pathway
my @dirs = glob ($dir/*);

# input file for program
my $data="ethanol.txt";

# enter to each subfolder
foreach $dir ( @dirs ) {
    chdir($dir) or die "Cannot cd to $dir: $!\n";

    # Run for ethanol
    system("echo 1 1 | program -o $data");  

    chdir("..");
}

Upvotes: 0

Views: 451

Answers (2)

Borodin
Borodin

Reputation: 126722

I notice that you have loaded File::chdir but fon't use it in your program. It can be a very useful module, and is particularly applicable in this situation. It works by defining a magic variable $CWD that evaluates to the current directory when read, and alters the current directory when written to. That means it can replace Cwd and chdir.

In addition, you can use local to localise changes to the working directory so that the original location is restored at the end of a block.

Take a look at this rewrite of your own code that should do what you need.

use strict;
use warnings;

use File::chdir;

my $data = 'ethanol.txt';

while (my $node = glob '*' ) {

    next unless -d $node;

    local $CWD = $node;
    system "echo 1 1 | program -o $data";
}

Upvotes: 1

Hunter McMillen
Hunter McMillen

Reputation: 61515

I think what you actually meant to say was, glob("$dir/*"), but I like using File::Find::Rule for this type of task:

#!/usr/bin/env perl 
use strict;
use warnings; 

use Cwd;
use File::Find::Rule;

my $dir     = cwd();
my @subdirs = File::Find::Rule->directory
                              ->in( $dir );

foreach my $subdir ( @subdirs ) {
   # do stuff
}

Upvotes: 3

Related Questions