使用ARGV为perl获取目录

时间:2016-03-25 16:26:49

标签: perl argv

   $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
我做错了什么? 感谢

3 个答案:

答案 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\\";