为什么我从readdir获取一个数字而不是一个文件名列表?

时间:2010-10-07 09:48:36

标签: perl directory

我有一段用于searchnig目录的Perl代码,如果找到匹配则显示该目录的内容。代码如下:

$test_case_directory = "/home/sait11/Desktop/SaLT/Data_Base/Test_Case";
$xml_file_name = "sample.xml"

$file_search_return = file_search($xml_file_name);
print "file search return::$file_search_return\n";


sub file_search
{
    opendir (DIR, $test_case_directory) or die "\n\tFailed to open directory that contains the test case xml files\n\n";

    print "xml_file_name in sub routines:: $xml_file_name\n";

    $dirs_found = grep { /^$xml_file_name/i } readdir DIR;
    print "Files in the directory are dirs_found :: $dirs_found\n";
    closedir (DIR);
    return $dirs_found;
}

输出是,

xml_file_name in sub routines:: sample.xml
Files in the directory are dirs_found :: 1
file search return::1

它没有返回找到的文件名。相反,它总是返回数字1。

我不知道为什么它没有返回目录中存在的名为sample.xml的文件名。

4 个答案:

答案 0 :(得分:8)

perldoc grep说:

  

在标量上下文中,返回表达式为真的次数。

这正是你在做的事情。因此,您找到了1个文件,并将结果分配给$dirs_found变量。

答案 1 :(得分:3)

($dirs_found) = grep { /^$xml_file_name/i } readdir DIR; #capture it

问题在于,您将grep评估为标量上下文,将其更改为列表上下文将为您提供所需的结果。

标量上下文中,grep返回表达式为真的次数。

列表上下文中,它返回表达式为true的元素。

答案 2 :(得分:3)

为什么要打开目录并查找特定文件名?如果你想查看文件是否存在,只需直接测试:

 use File::Spec::Functions;
 my $file = catfile( $test_case_directory, $xml_file_name );
 if( -e $file ) { ... }

但是当遇到这些问题时,请检查每一步的结果以检查您得到的结果。您的第一步将分解问题陈述:

 my @files = readdir DIR;
 print "Files are [@files]\n";

 my $filtered = grep { ... } @files;
 print "Files are [$filtered]\n";

执行此操作后,您会发现问题为grep。一旦你知道问题是grep,你就会阅读它的文档,注意你使用它是错误的,并且比在StackOverflow上发布问题所做的更快。 :)

答案 3 :(得分:2)

你应该说@dirs_found,而不是$dirs_found