文件名与-e和perl中的正则表达式匹配

时间:2010-02-08 14:59:35

标签: regex perl

我需要检查目录中是否存在文件。文件名的格式如下:

/d1/d2/d3/abcd_12345_67890.dat

在我的程序中,我将知道文件名最多为abcd_

我需要使用if选项编写-e条件,并找到与给定模式匹配的文件。

4 个答案:

答案 0 :(得分:11)

您可以使用glob返回名称与模式匹配的现有文件列表:

my @files = glob '/d1/d2/d3/abcd_*.dat';

在这种情况下,无需执行-e filetest。

答案 1 :(得分:3)

您不能将-e用于部分文件名匹配。

use File::Basename;
use File::Slurp;

my ($name, $path) = basename('/d1/d2/d3/abcd_');
my $exists = grep { /^\Q$name\E_[0-9]{5}_[0-9]{5}\.dat\z/ } read_dir $path;

如果目录包含大量文件,您仍然可以使用opendir并在while循环中使用readdir来保持程序的足迹不变。

我在这里使用File::Slurp::read_dir来呈现一个整洁的解决方案。

答案 2 :(得分:2)

如果我正确理解您的问题,您需要检查文件是否存在且文件名是否具有特定格式。如果这是你想要的,你可以这样做:

use File::Basename;

$file = "/d1/d2/d3/abcd_12345_67890.dat";

print "SUCCESS" if(-e $file and (basename($file)=~m{^abcd_}))

答案 3 :(得分:0)

怎么样

foreach $f (</d1/d2/d3/*.dat>) {if ($f =~ /\w{4}_\d{5}_\d{5}\.dat/)  {print $f}};