Chinaunix

标题: 不好意思问个简单的问题,帮忙解答 [打印本页]

作者: WinnerBoy    时间: 2015-07-05 10:12
标题: 不好意思问个简单的问题,帮忙解答
时间有点紧,没太多空看perl的书,不好意思,回头有空了我再自己研究,先请大侠们帮我写下。

很简单,就是一个目录下有很多这样的文件。
abc.tar, abc-20050101.tar, readme, ...

我就是想查询这个目录下的文件,返回那个abc-20050101.tar文件的文件名不带.tar(这种类型的文件只有这一个)

上边的例子就是返回 abc-20050101


多谢了!
作者: substr函数    时间: 2015-07-05 20:51
abc.tar, 不返回 abc
abc-20050101.tar,  返回 abc-20050101

我想了好久也没想出来
话说为啥不不返回abc
作者: flyingdancen    时间: 2015-07-05 22:44
本帖最后由 flyingdancen 于 2015-07-05 22:47 编辑

#比较老式的写法,一般用glob更方便
my $dir = "dir";
opendir DIR, "$dir" or die "$!";
while(my $file = readdir(DIR)) {
    if($file =~ /abc.{1,}\.tar/) {
        $file =~ s/\.tar//;
        print "$file\n";
    }
}
closedir DIR;

#glob 主要是我不是很熟悉,不知道能不能精确的匹配出来,以下可能错
my @file_arr = glob("$dir/abc-*.tar");
for my $file (@file_arr) {
    $file =~ s/\.tar$//;
    print "$file\n";
}


作者: huyang_    时间: 2015-07-06 11:46
本帖最后由 huyang_ 于 2015-07-06 11:49 编辑

刚学perl,答案不知道对不对,楼主可以看下
如果文件abc-20050101.tar都是由"abc"+"-"+日期组成的话,我的思路如下(不是完整代码,文件操作部分需要楼主自己写,我仅仅写出了正则匹配的部分):
my @str = qw(abc.tar abc-20050101.tar);
foreach (@str)
{
        print "$1:hello world\n" if(/(\w+(?!\.)-\d+)/);
}
找出文件之后,再用File::basename模块或者正则提取出你需要的部分




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2