проблема с функцией `glob` в perl - PullRequest
1 голос
/ 24 августа 2011

Я хочу получить список всех файлов, имя которых выглядит так: $res_dir/$line/$fub_name*.istf

означает: в каталоге $dir в подкаталоге $line файл, начинающийся с $name и заканчивающийся .istf.

каждый подкаталог содержит только 1 такой файл, но существует много подкаталогов. Я написал это:

foreach $line (@arr){
    chomp ($line);
    $new_istf = glob ("$res_dir/$line/$fub_name*.istf");
    do something...

но он не дает мне все файлы, а только половину из них. когда я добавил следующий отладочный код:

if ($new_istf){
    print "\tdbug:: $res_dir/$line/$fub_name*.istf:\t'$new_istf'\n";
} else {
    print "\tdbug:: $res_dir/$line/$fub_name*.istf:\t''\n";
}

и полученный результат был:

    dbug:: RESULTS//791202_0_SA0/ieuni5cts*.istf:   'RESULTS//791202_0_SA0/ieuni5cts.mlc.xxx.x.istf'
    dbug:: RESULTS//791212_0_SA0/ieuni5cts*.istf:   ''
    dbug:: RESULTS//791241_0_SA0/ieuni5cts*.istf:   'RESULTS//791241_0_SA0/ieuni5cts.mlc.xxx.x.istf'
    dbug:: RESULTS//791248_0_SA0/ieuni5cts*.istf:   ''
    dbug:: RESULTS//791251_0_SA0/ieuni5cts*.istf:   'RESULTS//791251_0_SA0/ieuni5cts.mlc.xxx.x.istf'
    dbug:: RESULTS//791258_0_SA0/ieuni5cts*.istf:   ''
    dbug:: RESULTS//791272_0_SA0/ieuni5cts*.istf:   'RESULTS//791272_0_SA0/ieuni5cts.mlc.xxx.x.istf'
    dbug:: RESULTS//791273_0_SA1/ieuni5cts*.istf:   ''
    dbug:: RESULTS//791301_0_SA0/ieuni5cts*.istf:   'RESULTS//791301_0_SA0/ieuni5cts.mlc.xxx.x.istf'
    dbug:: RESULTS//791333_0_SA0/ieuni5cts*.istf:   ''
    dbug:: RESULTS//791349_0_SA0/ieuni5cts*.istf:   'RESULTS//791349_0_SA0/ieuni5cts.mlc.xxx.x.istf'
    dbug:: RESULTS//791357_0_SA0/ieuni5cts*.istf:   ''
    dbug:: RESULTS//791405_0_SA1/ieuni5cts*.istf:   'RESULTS//791405_0_SA1/ieuni5cts.mlc.xxx.x.istf'
    dbug:: RESULTS//791432_0_SA0/ieuni5cts*.istf:   ''
    dbug:: RESULTS//791434_0_SA0/ieuni5cts*.istf:   'RESULTS//791434_0_SA0/ieuni5cts.mlc.xxx.x.istf'
    dbug:: RESULTS//791459_0_SA0/ieuni5cts*.istf:   ''
    dbug:: RESULTS//791462_0_SA0/ieuni5cts*.istf:   'RESULTS//791462_0_SA0/ieuni5cts.mlc.xxx.x.istf'
    dbug:: RESULTS//791463_0_SA0/ieuni5cts*.istf:   ''
    dbug:: RESULTS//791467_0_SA0/ieuni5cts*.istf:   'RESULTS//791467_0_SA0/ieuni5cts.mlc.xxx.x.istf'
    dbug:: RESULTS//791471_0_SA1/ieuni5cts*.istf:   ''

но все эти файлы существуют. поскольку glob предположим, что он работает как интерпретатор продажи, я проверил его, а когда я echo RESULTS//791463_0_SA0/ieuni5cts*.istf (и любой другой файл, который не был обнаружен glob, он дает правильное имя файла.

Я также пытался запустить glob как один лайнер с путями, которые не дали результата, и это сработало:

perl -e 'print glob("RESULTS//791467_0_SA0/ieuni5cts*.istf"),"\n"'

и это также дало правильный результат

Где проблема в моем коде?

1 Ответ

10 голосов
/ 24 августа 2011

С perldoc -f glob:


В контексте списка возвращает (возможно, пустой) список имен файлов расширения на значение EXPR, такие как стандартная оболочка Unix / bin / csh сделает. В скалярном контексте glob повторяет такие расширение имени файла, возвращающее undef, когда список исчерпан.


Отправленный код находится в скалярном контексте.

Посмотрите, решит ли это вызов в контексте списка:

my ( $new_istf ) = glob ( "$res_dir/$line/$fub_name*.istf" );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...