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

时间:2010-10-18 22:15:46

标签: perl file match exists glob

我可以在Perl中做这样的事情吗?意义模式匹配文件名并检查它是否存在。

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

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

3 个答案:

答案 0 :(得分:33)

您可以使用glob返回与模式匹配的所有文件的数组:

@files = glob("*.file");

foreach (@files) {
    # do something
}

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

if (glob("*.file")) {
    # At least one file matches "*.file"
}

答案 1 :(得分:0)

在* 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支持的。但是大多数shell支持使用'*'和'?' - 他们在我看到的任何地方都意味着同样的事情。当然,如果你删除了对'标量'函数的调用,它将返回匹配 - 对于查找这些变量文件名很有用。

答案 2 :(得分:0)

在Windows上,我必须使用File::Glob::Windows,因为Windows路径中的反斜杠似乎无法正常工作。