Perl: сопоставление файла с форматом, заданным другим файлом - PullRequest
0 голосов
/ 29 февраля 2012

Предположим, у меня есть 2 файла в следующем формате.

Файл1:

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

Файл2:

username hello
password test
password testing
hello world
good luck

Я хочу иметь возможность проверить этот файл2следует тому же формату, что и File1.Это означает, что если файл следующего формата не сможет пройти мой тест.

BadFile:

username hello
password test
hello world

Должно быть ровно 2 строки, начинающиеся с «пароля»,В настоящее время моя программа может проверить, есть ли строки, начинающиеся с «username» и «password».Кажется, я не могу проверить, что если в File1 есть повторяющиеся строки с одним и тем же начальным (-ыми) словом (-ями) «password», он также должен проверить, что File2 должен иметь одинаковое количество строк с одинаковыми (-ыми) начальными (-ыми) словами (-ами),то есть.Моя программа сгенерирует пропуск при запуске File1 и BadFile, чтобы проверить, соответствует ли BadFile формату File1.

Мне не нужно хранить вещи после ключевых слов (т. Е. "Hello", "test",«тестирование» в этом случае), но я должен иметь возможность различить, что есть две строки, начинающиеся с «пароля», для проверки.

Есть также строки, которые не имеют «<...>»,По сути, все, что находится в File1, должно быть найдено в FileN для передачи FileN.

Есть идеи, какую структуру данных мне следует использовать для достижения этой цели?Я думаю о хэше массивов, но он кажется слишком сложным для меня и для этого случая.

Ответы [ 2 ]

1 голос
/ 29 февраля 2012
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 голосов
/ 29 февраля 2012

это фрагмент кода, который может вам помочь (замените ДАННЫЕ открытием файла):

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...