perl中`glob`函数的问题

时间:2011-08-24 10:41:30

标签: 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...

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

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 个答案:

答案 0 :(得分:10)

来自perldoc -f glob


  

在列表上下文中,返回一个(可能为空)文件名列表   扩展EXPR的值,例如标准的Unix shell   / bin / csh会这样做。在标量上下文中,glob遍历这些   文件名扩展,当列表用完时返回undef。


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

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

my ( $new_istf ) = glob ( "$res_dir/$line/$fub_name*.istf" );