如何使用perl获得工作目录中的子文件夹名称?

如何使用perl获得工作目录中的子文件夹名称?,perl,Perl,我在主文件夹中有几个子文件夹。我的程序将在每个子文件夹中进行一些计算。首先,代码将在主文件夹中为所有计算创建“结果”文件夹。对于每个子文件夹中的计算,我想在“result”文件夹中创建一个文件夹。但它们应该与子文件夹同名 我的工作目录是“/home/abc/Desktop/test”。“测试”是我的主文件夹。“测试”文件夹中有“a”、“b”和“c”子文件夹。我的代码在“测试”主文件夹中创建“结果”文件夹。但它也应该在“结果”文件夹中创建“a”、“b”和“c”子文件夹。如何修复我的代码 #!/us

我在主文件夹中有几个子文件夹。我的程序将在每个子文件夹中进行一些计算。首先,代码将在主文件夹中为所有计算创建“结果”文件夹。对于每个子文件夹中的计算,我想在“result”文件夹中创建一个文件夹。但它们应该与子文件夹同名

我的工作目录是“/home/abc/Desktop/test”。“测试”是我的主文件夹。“测试”文件夹中有“a”、“b”和“c”子文件夹。我的代码在“测试”主文件夹中创建“结果”文件夹。但它也应该在“结果”文件夹中创建“a”、“b”和“c”子文件夹。如何修复我的代码

#!/usr/bin/env perl
use strict;
use warnings; 
use File::Path qw/make_path/;
use Cwd;

my $dir     = cwd();

opendir (DIR, $dir) or die "Unable to open current directory! $!\n";
my @subdirs = readdir (DIR) or die "Unable to read directory! $!\n";
closedir DIR;

my $result_path = "$dir/results";
make_path("$result_path");

foreach my $subdir ( sort @subdirs ) {

chdir($subdir) or die "Cannot cd to $dir: $!\n";

make_path("$result_path/$subdir");

 system("echo '1 0' | program -f data.mol -o $result_path/$subdir outfile.txt");

chdir("..");

}
以起始点
$dir
沿目录树递归查找所有目录。对于它找到的每个目录,您都使用basename

因此,当它遇到
$dir/test/a
时,它的
basename
就是
a
,并且您的代码继续创建
result/a

我怀疑您不需要在一棵树中找到所有的目录——但是考虑到您混乱的问题描述,很难确定

也许你只想
opendir
目录,
readdir
所有条目只保留除
以外的目录。
,以及
closedir
,而不是遍历
$dir

下的整个树,我认为这不是解决这个问题的好选择。该模块的特点是递归搜索目录树,这里您只需要一个文件夹中所有目录的列表。使用
grep-d,glob'*'

下面是一个版本,它根据您的需要使用该模块。它避免了对
Cwd
File::Basename
的需要,并且允许您定位当前工作目录,这样就不需要在每个循环结束时使用
chdir'..

use strict;
use warnings; 

use File::chdir;

my @folders = grep -d, glob '*';

my $result_path = "$CWD/result";
mkdir $result_path;

for my $folder ( @folders ) {
  my $result_folder = "$result_path/$folder";
  mkdir $result_folder;
  local $CWD = $folder;
  system("echo '1 0' | program -f data.mol -o $result_folder/output.txt");
}

更改代码后,我无法重现问题
$folder
包含目录名。抱歉。那是个打字错误。我编辑了我的代码。但是它没有给出我想要的。好吧,给出的代码没有任何作用。你如何检查结果?错误可能在那里,而不是在这里。我打印它来筛选它。将它添加到问题中的代码中。谢谢。但是您的代码在“result”文件夹中创建了“a”、“b”、“c”和“result”文件夹。@perlselami:好的,修复了。现在,在创建
结果之前,它将获得子目录列表。我希望您能用清晰简洁的问题描述更新您的问题。我希望@Borodin没有给你鱼,因为现在你没有动力去解决你的问题。谢谢@Sinan,我更新了我的问题和代码。我怎样才能修好它?
use strict;
use warnings; 

use File::chdir;

my @folders = grep -d, glob '*';

my $result_path = "$CWD/result";
mkdir $result_path;

for my $folder ( @folders ) {
  my $result_folder = "$result_path/$folder";
  mkdir $result_folder;
  local $CWD = $folder;
  system("echo '1 0' | program -f data.mol -o $result_folder/output.txt");
}