如何使用perl访问当前工作目录中的所有子文件夹?

时间:2015-03-06 21:20:01

标签: perl

我正在尝试访问当前工作目录中的所有子文件夹。然后我想在每个子文件夹中运行一个程序。我怎样才能做到这一点?我的代码给出了以下错误:

在./analysis.pl第13行,接近"" 08")" 错误后BEGIN不安全 - 编译在./analysis.pl第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("..");
}

2 个答案:

答案 0 :(得分:3)

我认为您实际想要说的是glob("$dir/*"),但我喜欢使用File::Find::Rule进行此类任务:

#!/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
}

答案 1 :(得分:1)

我注意到您已加载File::chdir但未在程序中使用它。它可以是一个非常有用的模块,特别适用于这种情况。它的工作原理是定义一个魔术变量$CWD,它在读取时计算当前目录,并在写入时改变当前目录。这意味着它可以取代Cwdchdir

此外,您可以使用local本地化对工作目录的更改,以便在块结束时恢复原始位置。

看看你自己的代码的重写,它应该做你需要的。

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";
}