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



我正在尝试访问当前工作目录中的所有子文件夹。然后我想在每个子文件夹中运行一个程序。我该怎么做?我的代码出现以下错误:

globat的论点太多了/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("..");
}

我想你实际上想说的是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
}

我注意到您已经加载了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";
}

最新更新