2010-10-07 66 views
1

我有一段Perl代碼用於searchnig目錄並顯示該目錄的內容(如果找到匹配項)。代碼如下:爲什麼我會從readdir獲取一個數字而不是文件名列表?

$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

有關更簡單的方法來閱讀目錄的內容,請參閱http://stackoverflow.com/questions/3772001。 – FMc 2010-10-07 10:12:09

+1

'readdir'沒有返回任何'錯誤的'。你認爲'grep'的工作方式與'grep'在現實中的工作方式不一致。見http://perldoc.perl.org/functions/grep.html – 2010-10-07 10:46:30

+0

你真的需要打開'use strict;使用警告;'。它會讓你避免許多麻煩。 – Daenyth 2010-10-07 17:55:30

回答

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

的問題是,你評估grep標量上下文,將其更改爲列表環境會給你想要的結果。

標量上下文grep返回表達式爲真的次數。

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

+0

這完美的作品...謝謝 – 2010-10-07 10:33:14

2

你應該說@dirs_found,不$dirs_found

8

perldoc grep說:

在標量情況下,返回的時間表達是真實的數字。

而這正是你在做的。因此,您找到了1個文件,並將該結果分配給$dirs_found變量。

3

你爲什麼要打開一個目錄並尋找一個特定的文件名?如果你想看看該文件是存在的,只是測試它直接:

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

當你遇到這些各種各樣的問題,但是,檢查結果在每一步檢查,你做了什麼。一旦你這樣做,你看到的問題是grep

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

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

:你的第一個步驟就是將問題分解聲明。一旦你知道問題是grep,你應該閱讀它的文檔,注意你錯誤地使用了它,並且你比在StackOverflow上發佈一個問題要快。 :)

相關問題