perl中`glob`函数的问题

SIM*_*MEL 1 perl glob

我想获得名称如下所有文件的列表: $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...
Run Code Online (Sandbox Code Playgroud)

但它没有给我所有的文件,但只有一半.当我添加了以下的调试代码:

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";
}
Run Code Online (Sandbox Code Playgroud)

结果输出是:

    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:   ''
Run Code Online (Sandbox Code Playgroud)

但所有这些文件都存在.因为glob假设像销售翻译一样工作,我已经检查了它,当我这样做时echo RESULTS//791463_0_SA0/ieuni5cts*.istf(以及其他未被检测到的glob文件,它会给出正确的文件名.

我还尝试将glob作为一个衬里运行,其路径没有给出结果,并且它有效:

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

它也给出了正确的结果

我的代码中的问题在哪里?

Zai*_*aid 10

来自perldoc -f glob:


在列表上下文中,返回EXPR值的文件名扩展(可能为空)列表,例如标准的Unix shell/bin/csh.在标量上下文中,glob遍历此类文件名扩展,在列表耗尽时返回undef.


发布的代码位于标量上下文中.

看看在列表上下文中调用它是否解决了问题:

my ( $new_istf ) = glob ( "$res_dir/$line/$fub_name*.istf" );
Run Code Online (Sandbox Code Playgroud)