$args = @ARGV;
foreach $ARGV (@ARGV)
{
$guitestsDir = "v:\\stuf\\comment\\logs\\$ARGV\\";
############################open logs folder#########################
if ( -d $guitestsDir ) {
opendir( DIR, $guitestsDir );
while ( defined( $pathofdir = readdir(DIR) ) ) {
next if ( $pathofdir eq "." );
next if ( $pathofdir eq ".." );
next unless (-d "$guitestsDir/$pathofdir");
push (@pathallSuites, $pathofdir);
}
closedir(DIR);
}
print "@pathallSuites\n";
嗨,我将目录1和2作为参数。在目录1中, dir a和b 位于目录2 c和d
当我为print "@pathallSuites\n";
运行它时,输出将为:
a b
a b c d
应该是
a b
c d
我做错了什么?
感谢
答案 0 :(得分:2)
当前的问题是,您在@pathallSuites
循环的执行之间没有排空foreach
,但在此背后是您没有use strict
的问题并且use warnings 'all'
到位,必须始终出现在您编写的每个Perl程序的顶部。然后,如果你在循环中声明它,Perl将为你重置数组
我建议您使用glob
来搜索文件和目录,并使用File::Spec::Functions
库来操作文件路径,而不是更容易出错的基本字符串函数
结果是更简洁的代码,如此处所示。对grep
的调用会过滤glob
的结果,因此它只包含没有任何文件名的目录名
请注意,此程序与您自己的程序不同,输出是每个子目录的完整路径,而不仅仅是子目录的名称。如果你真的想要那么名字,那么改变是微不足道的,但我认为你更有可能真的需要整个事情。如果我错了,请告诉我
use strict;
use warnings 'all';
use File::Spec::Functions 'catdir';
use constant ROOT_DIR => 'V:/stuf/comment/logs';
for my $subdir ( @ARGV ) {
my @path_all_suites = grep -d, glob catdir(ROOT_DIR, $subdir, '*');
print "$_\n" for @path_all_suites;
print "\n";
}
答案 1 :(得分:2)
这是一个精简版本,所有内容都进入一行输出:
print map( "$_ ", map( glob( "$_/*/" ), @ARGV )), "\n";
或单列:
print map( "$_\n", map( glob( "$_/*/" ), @ARGV ));
答案 2 :(得分:1)
您永远不会重置@pathAllSuites
变量。在foreach循环开始时,您需要自己执行此操作。
foreach $ARGV (@ARGV)
{
$#pathAllSuites = -1; # Set the 'last index' to -1, effectively clearing it.
$guitestsDir = "v:\\stuf\\comment\\logs\\$ARGV\\";