Почему я получаю число вместо списка имен файлов из readdir? - PullRequest
1 голос
/ 07 октября 2010

У меня есть фрагмент кода 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 ]

8 голосов
/ 07 октября 2010

perldoc grep говорит:

В скалярном контексте возвращает количество раз, когда выражение было истинным.

И это именно то, что выделают.Итак, вы нашли 1 файл, и этот результат присваивается переменной $dirs_found.

3 голосов
/ 07 октября 2010

Почему вы открываете каталог и ищете конкретное имя файла?Если вы хотите проверить, существует ли файл, просто проверьте его напрямую:

 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 голосов
/ 07 октября 2010
($dirs_found) = grep { /^$xml_file_name/i } readdir DIR; #capture it

Проблема была в том, что вы оценивали grep как скалярный контекст , измените его на список списка даст вам желаемый результат.

В скалярный контекст , grep возвращает количество раз, когда выражение было истинным.

В контексте списка он возвращает элементы, для которых выражение было истинным.

2 голосов
/ 07 октября 2010

вы должны сказать @dirs_found, а не $dirs_found

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...