代码之家  ›  专栏  ›  技术社区  ›  Jean

如何测试Perl中是否存在与模式匹配的文件名?

  •  14
  • Jean  · 技术社区  · 14 年前

    我可以用Perl做类似的事情吗?意味着模式与文件名匹配,并检查它是否存在。

        if(-e "*.file")
        {
          #Do something
        }
    

    我知道请求系统列出存在的文件的较长解决方案;将其作为文件读取,然后推断文件是否存在。

    3 回复  |  直到 7 年前
        1
  •  33
  •   user229044    13 年前

    你可以使用 glob 要返回与模式匹配的所有文件的数组,请执行以下操作:

    @files = glob("*.file");
    
    foreach (@files) {
        # do something
    }
    

    如果只想知道是否存在与模式匹配的文件,可以跳过分配:

    if (glob("*.file")) {
        # At least one file matches "*.file"
    }
    
        2
  •  0
  •   Jim Black    11 年前

    在*nix系统上,我使用了下面的内容,效果很好。

    sub filesExist { return scalar ( my @x = `ls -1a 2> /dev/null "$_[0]"` ) }
    

    它以找到的匹配项的数目答复,如果没有,则为0。使其易于用于“if”条件,如:

    if( !filesExist( "/foo/var/not*there.log" ) &&
        !filesExist( "/foo/var/*/*.log" ) &&
        !filesExist( "/foo/?ar/notthereeither.log" ) )
    {
        print "No matches!\n";
    } else {
        print "Matches found!\n";
    }
    

    您可以使用的模式具体取决于您的shell支持什么。但是大多数外壳支持使用“*”和“?”-它们在我见过的任何地方都是一样的。当然,如果删除了对“scalar”函数的调用,它将返回匹配项,这对于查找那些变量文件名很有用。

        3
  •  0
  •   Matthew Lock fge    7 年前

    在窗户上我不得不用 File::Glob::Windows 由于分隔反斜杠的Windows路径似乎不起作用,Perl的glob。