我有一段用于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
的文件名。
答案 0 :(得分:8)
答案 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