使用ARGV for perl获取目录

使用ARGV for perl获取目录,perl,argv,Perl,Argv,嗨,我将目录1和2作为参数。目录1中的目录a和b将是目录2中的目录c和目录d 当我为print“@pathallSuites\n”运行它时输出将为: $args = @ARGV; foreach $ARGV (@ARGV) { $guitestsDir = "v:\\stuf\\comment\\logs\\$ARGV\\"; ############################open logs folder######################### if ( -d

嗨,我将目录1和2作为参数。目录1中的目录a和b将是目录2中的目录c和目录d 当我为
print“@pathallSuites\n”运行它时输出将为:

   $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";
应该是

a b
a b c d
我做错了什么?
谢谢

您从未重置
@pathAllSuites
变量。在foreach循环的开始,您需要自己完成这项工作

a b
c d

您从未重置
@pathAllSuites
变量。在foreach循环的开始,您需要自己完成这项工作

a b
c d

直接的问题是,在执行
foreach
循环之间,您没有清空
@pathallSuites
,但在这背后的问题是,您没有
使用strict
使用警告“all”
,它们必须始终出现在您编写的每个Perl程序的顶部。然后,如果在循环中声明数组,Perl将为您重置该数组

我建议您使用来搜索文件和目录,并使用库来操作文件路径,而不是更容易出错的基本字符串函数

结果是代码更加简洁,如下所示。调用以过滤
glob
的结果,使其仅包含目录名,而不包含任何文件名

请注意,此程序与您自己的不同之处在于,输出是每个子目录的完整路径,而不仅仅是子目录的名称。如果你真的想知道这个名字,那么改变就很简单了,但我认为你更可能真的需要整个名字。如果我错了,一定要告诉我

foreach $ARGV (@ARGV)
{
$#pathAllSuites = -1; # Set the 'last index' to -1, effectively clearing it.
$guitestsDir = "v:\\stuf\\comment\\logs\\$ARGV\\";

直接的问题是,在执行
foreach
循环之间,您没有清空
@pathallSuites
,但在这背后的问题是,您没有
使用strict
使用警告“all”
,它们必须始终出现在您编写的每个Perl程序的顶部。然后,如果在循环中声明数组,Perl将为您重置该数组

我建议您使用来搜索文件和目录,并使用库来操作文件路径,而不是更容易出错的基本字符串函数

结果是代码更加简洁,如下所示。调用以过滤
glob
的结果,使其仅包含目录名,而不包含任何文件名

请注意,此程序与您自己的不同之处在于,输出是每个子目录的完整路径,而不仅仅是子目录的名称。如果你真的想知道这个名字,那么改变就很简单了,但我认为你更可能真的需要整个名字。如果我错了,一定要告诉我

foreach $ARGV (@ARGV)
{
$#pathAllSuites = -1; # Set the 'last index' to -1, effectively clearing it.
$guitestsDir = "v:\\stuf\\comment\\logs\\$ARGV\\";

这是一个压缩版本,所有内容都将放在一行输出中:

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";
}
或单个列:

print map( "$_ ", map( glob( "$_/*/" ), @ARGV )), "\n";

这是一个压缩版本,所有内容都将放在一行输出中:

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";
}
或单个列:

print map( "$_ ", map( glob( "$_/*/" ), @ARGV )), "\n";

$#pathAllSuites=-1
是一种不必要的神秘书写方式
@pathAllSuites=()
,最好在for循环中声明它:
foreach$ARGV(@ARGV){my@pathAllSuites;..
$#pathAllSuites=-1
是一种不必要的神秘书写方式
@pathAllSuites=()
最好是在for循环中声明它:
foreach$ARGV(@ARGV){my@pathallSuites;..
$ARGV
是一个预定义变量,在从
读取时包含当前文件句柄的名称,$ARGV
是一个预定义变量,在从
读取时包含当前文件句柄的名称。