2016-06-29 4 views
1

長いリストのファイルがあり、その拡張子に基づいて意思決定を試みています。この全体は私の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を特定することになります。正しい正規表現を見つける手助けをする人がいますか?

答えて

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

+0

私はあなたのソリューションには満足していますが、私はそれがうまくいかないケースを見つけました。空白を含まないファイルがありますが、拡張子の後にバージョン番号が入っています( 'xyz.pj1.4.0'のようなもの)。どうすればそれを捕まえることができますか? – UsefulUserName

+0

@UsefulUserName:どのように分類しますか? 1,2,3のように?あるいは、そのような場合に新しいクラスを追加したいですか? – choroba

+0

ケース3.適切にフォーマットされていないものは除外/無視する必要があります。 – UsefulUserName

1

File::Basenamefileparseがこれを処理できます。それを正規表現アップを与える使用したいと、それはファイル名を壊す:

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

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

あなたは拡張機能として、いくつかの語尾を無視することを言及。正規表現を調整することができます。

エクステンションを取得したら、好きな方法で分岐することができます。

私はあなたが良いasnwerを持っていることを知られているが、私はこのような何かをしたいと思います
1

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); 

このような何かをする理由は、あなたが欲しいものを実行する唯一の正規表現の評価が必要だということですあなたが扱うことを期待しているファイル拡張子ごとに。

+0

私はそれについて何か考えていました。問題は私が知らないし、リストに含まれるすべての拡張子を知ることができないということです。そして、もし私がそうしたとしても、スクリプトは、異なる拡張子を持つ異なるファイルを含む他のリストと共に使用されるかもしれません。しかし、ありがとう、それは非常にきちんとした解決策だったでしょう。 – UsefulUserName

関連する問題