Perl使用正则表达式来识别文件列表中的文件扩展名

时间:2016-06-29 13:51:33

标签: regex perl

我有很长的文件列表,我正在尝试根据其扩展程序做出决定。这一切都必须成为我的perl程序的一部分。以下是列表的示例:

a.pj
b.pj
null
c.xlsx
gibberishWithNoExtension
d.pj
f.docx 
g.pj 1.17 and 1.15.1.1

决策规则是:

1) If the extension is ".pj" do something.
2) If the extension is anything else do something else
3) If there is something else after the extension (like version numbers) or there is no extension at all: ignore it

第一点应该相当容易。我猜它会是这样的:

my $string = a.pj;
if ($string =~ /.pj/) {
    say 'success!'
}

但我被其他案件困住了。特别是在确定第3点时。你们中有些人可以帮助我找到合适的正则表达式吗?

3 个答案:

答案 0 :(得分:4)

在2之前检查3似乎更容易:

#!/usr/bin/perl
use warnings;
use strict;

while (<DATA>) {
    chomp;
    if (/\.pj$/) {
        print "Doing something with $_\n";

    } elsif (/ / || ! /\./) {
        print "Ignoring $_\n";

    } else {
        print "Doing something else with $_\n";
    }
}

__DATA__
a.pj
b.pj
null
c.xlsx
gibberishWithNoExtension
d.pj
f.docx
g.pj 1.17 and 1.15.1.1

请注意第一个正则表达式中的反斜杠。裸点与换行符匹配,但您不想匹配a.xpj。需要美元符号才能阻止匹配a.pjx

答案 1 :(得分:1)

File::Basename&#39; fileparse可以处理此问题。给它想要使用的正则表达式,它打破了文件名:

use v5.10;
use File::Basename qw(fileparse);

while (<DATA>) {
    chomp;
    my( $name, $dir, $suffix ) = fileparse( $_, qr/\.[^.]+\z/ );
    say "$_ -> $suffix";
}

你提到你想忽略一些结尾作为扩展。你可以定制正则表达式。

获得扩展后,您可以按照自己喜欢的方式进行分支。

答案 2 :(得分:1)

我知道你有一个很好的asnwer,但我想做这样的事情:

open (INP, "<path_of_file/file_list.txt") or die $!:
while( <INP> ) {
    chomp ( $_ );
    #~ whatever followed by dot '\.', then extension captured in a group '$1'
    #~ line must be evaluated as true only if its ended with a extension name
    #~ otherwise it'll be ignored (as you expect to do)
    if ( $_ =~ m/\.(.+)$/ ) {
        if( $1 eq "pj" ) { #~ 1) If the extension is ".pj" do something.
            #~ do something with pj extension
        } elsif ( $1 eq "xlsx" ) { # and other 'elses' rule 2)
            #~ do something with xlsx extension
        } elsif ( $1 eq "docx" ) {
            #~ do something with docx extension
        } elsif ( $1 eq "..." ) {
            #~ do something with ... extension
        } else {
            #~ do something with not expected extension
        }
    else { #~ rule 3) If there is something else after the extension
        #~ not a text formated as a file name followed by extension
    }
}
close (INP);

执行此类操作的原因是您只需要一次正则表达式评估,即可为您希望处理的每个文件扩展名执行所需的操作。