我正在尝试访问当前工作目录中的所有子文件夹。然后我想在每个子文件夹中运行一个程序。我该怎么做?我的代码出现以下错误:
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
来工作,该变量在读取时计算为当前目录,在写入时更改当前目录。这意味着它可以替换Cwd
和chdir
。
此外,您可以使用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";
}