我正在尝试访问当前工作目录中的所有子文件夹。然后我想在每个子文件夹中运行一个程序。我怎样才能做到这一点?我的代码给出了以下错误:
在./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("..");
}
答案 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
,它在读取时计算当前目录,并在写入时改变当前目录。这意味着它可以取代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";
}