2012-02-29 22 views
0

次の形式のファイルが2つあるとします。Perl:別のファイルで指定された形式のファイルを一致させる

はFile1:

username <username> 
password <password1> 
password <password2> 
hello world 

File2の:

username hello 
password test 
password testing 
hello world 
good luck 

私はFile2のがFile1のと同じ形式に従っていることを確認することができるようにしたいです。これは、次の形式のファイルが私のテストで合格できなくなることを意味します。

BADFILE:

username hello 
password test 
hello world 

"パスワード" で始まり、正確に2行がなければなりません。現在、私のプログラムは、 "username"と "password"で始まる行があるかどうかを確認することができます。私は、File1が "password"の同じ開始単語で重複した行を持っているかどうかをチェックすることができないようで、File2が同じ開始語を持つ同じ数の行を持っていることを確認する必要があります。 。すなわち、 BadFileがFile1の形式に従っているかどうかをテストするために、私のプログラムはFile1とBadFileを実行するときにパスを生成します。

"hello"、 "test"、 "testing"のようなキーワードの後に​​は、この項目を保存する必要はありませんが、 "password"で始まる2行を区別できるはずです。私がチェックするために。

「< ...>」のない行もあります。基本的に、それがFile1にあるものはFileN for FileNで見つかるはずです。

私はそれを達成するためにどのようなデータ構造を使用すべきですか?私は配列のハッシュを考えていますが、それは私にとってもこの場合には複雑すぎるようです。

答えて

1
my $template_qfn = ...; 
my $file_qfn  = ...; 

my $template = do { 
    open(my $fh, '<', $template_qfn) or die $!; 
    local $/; 
    <$fh> 
}; 

my $template_pat = quotemeta($template); 
$template_pat =~ s/\\<[^<>\n]*\\>/[^\n]+/g; 
my $template_re = qr/^$template_pat\z/; 

my $file = do { 
    open(my $fh, '<', $file_qfn) or die $!; 
    local $/; 
    <$fh> 
}; 

die("File \"$file_qfn\" doesn't match template \"$template_qfn\"\n") 
    if $file !~ $template_re; 
+0

私は「<...>」を持たない「Hello World」のような場合については? – Sakura

+0

尋ねられたようにチェックされます。 – ikegami

+0

テスト済みです。バグを修正しました。 – ikegami

0

これはあなた(開いているファイルでデータを代用)助けてコードの一部です:

use strict; 
my @tokens = qw/username password password/; 
my $current = 0; 
my $line_number = 1; 

while(my $line = <DATA>) { 
    my $expected = $tokens[$current]; 
    if($line !~ m!^$expected !) { 
     die "Invalid format: expected '$expected' at data file line number: $line_number; line: $line" 
    } 
    $current = ++$current % scalar(@tokens); 
    $line_number++; 
} 

die "Invalid format; sequence incomplete" if $current != 0; 
print "Ok!\n"; 

__DATA__ 
username hello 
password test 
password testing 
+0

"<...>"がない "hello world"のようなケースはどうですか? – Sakura

関連する問題