Как я могу сделать так, чтобы perl мог распознавать неизвестный образец? - PullRequest
1 голос
/ 14 июля 2020

У меня есть такой файл, как file1:

tree_apple
tree_banana
tree_orange
tree_cherry

Я хочу создать сценарий, распознающий согласованную структуру именования элементов в файле. Для file: 1 согласованной структурой именования будет «дерево». Поэтому мне нужен сценарий perl, который читает файл и сохраняет согласованную структуру именования, поскольку переменная позволяет сказать $pattern. Предположим, что ВСЕ элементы в файле имеют согласованную структуру именования. Не имеет значения, если, скажем, только 2 элемента в списке имеют шаблон, если шаблон присутствует не во всех элементах, то это не единообразная структура именования.

Примечание: файлы имеют некоторая структура. Они состоят только из букв и цифр c, но могут быть разделены на группы с помощью «», например, фрукты, разделенные на группу после «».

Также обратите внимание: согласованное именование структура не всегда находится в начале, она также может быть в середине или в конце.

Если бы у нас был файл, такой как file2:

mask_protection
gloves_protection
armour_protection
boots_protection

Теперь согласованная структура именования «защита», обратите внимание, как теперь он находится в конце.

Или, если бы у нас был файл, такой как file3:

123_red_456
123_blue_456
123_green_456
123_yellow_456

Теперь согласованная структура именования находится как в начале, так и в конец. Это 123 и 456.

или, наконец, он может быть посередине, например, с "ячейкой" в file4:

Apple_cell_phone
Blood_cell_donation
Prison_cell_inspection
Excel_cell_row

Итак, есть ли способ просмотреть файл и найти согласованный образец с perl?

1 Ответ

3 голосов
/ 14 июля 2020

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

my @template;
if (defined( my $line = <> )) {
   chomp($line);
   @template = split(/_/, $line, -1);

   while (defined( $line = <> )) {
      chomp($line);
      my @fields = split(/_/, $line, -1);
      @template == @fields
         or die("Inconsistency in the number of fields at \"$ARGV\" line $.\n");

      for my $i (0..$#template) {
         if (defined($template[$i]) && $template[$i] ne $fields[$i]) {
            $template[$i] = undef;
         }
      }
   }
}

say join "_", map { $_ // '*' } @template;

Вывод:

$ ./a file1
tree_*

$ ./a file2
*_protection

$ ./a file3
123_*_456

$ ./a file4
*_cell_*

Если мы не можем полагаться на единообразие использования _, которое встречается в ваших примерах, вам нужно объяснить, почему шаблон для file3 не соответствует 123_*e*_456.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...