Программа
zdim работоспособна, но если ваша ситуация была более сложной, то while
l oop будет запутываться. Есть лучший узор, который вы можете использовать, чтобы вы могли продолжать добавлять узоры. Белый Медведь подошел близко, но все еще обладает дополнительными, специальными знаниями, запеченными в l oop.
Создайте таблицу тех вещей, которые вы хотите сопоставить. Удаление этой информации из l oop имеет несколько преимуществ. Во-первых, это упрощает l oop. Во-вторых, легче увидеть параллельную структуру. В-третьих, это на один шаг ближе к хранению информации о сопоставлении в конфигурации. Порядок в массиве - это порядок, в котором я хочу их протестировать:
my @matchers = (
# label pattern
[ 'syntax', qr/syntax/ ],
[ 'format', qr/format/ ],
);
l oop тогда становится примерно таким. Эта версия while
работает для любого количества сопоставителей, которое вы хотите определить. Этот while
не имеет специальных знаний о вводе или сопоставлении. Его задача - преобразовать все данные во что-то, чем вы сможете легко управлять позже, и сделать это без потери информации:
use v5.26;
my %hash;
LINE:
while (my $line = <$fh>) {
chomp $line;
foreach my $matcher ( @matchers ) {
next unless $line =~ m/$matcher->[1]/;
my( $n ) = $line =~ /(\d+)/;
push $hash{ $matcher->[0] }{$n // 0}->@*, $line;
next LINE; # or not, if you want to sort into multiple categories
}
}
Теперь у меня есть структура данных, в которой есть номер в сообщении об ошибке и список всех совпавших строк. Это не обязательно должна быть ваша окончательная структура данных, но она может помочь вам в этом. В конечном итоге требования к выходным данным изменятся, и если вы запекли слишком много решений в while
, вам придется начинать заново. Вместо этого вы получите это независимо от результата, и это всего лишь вопрос преобразования этого во все, что вы хотите в конечном итоге. Я бы определенно хотел увидеть, как разные строки сортируются по категориям. Я могу быстро отследить неправильную категоризацию следующим образом:
{
format => {
"0" => ["check script for formatting issues"],
"1" => ["the file contains 1 formatting issues"],
"5" => ["the file contains 5 formatting issues"],
},
syntax => {
1 => ["there are 1 syntax issues with semicolon"],
2 => ["2 syntax issues have been found"],
5 => [
"there are 5 syntax issues with semicolon",
"there are 5 syntax issues with commas",
],
6 => ["6 syntax issues have been found"],
11 => ["there are 11 syntax issues with semicolon"],
},
}
Я бы хотел go на один шаг дальше, чтобы включить номер строки в каждую строку. Номер строки последнего считанного дескриптора файла - это специальная переменная $.
:
push $hash{ $matcher->[0] }{$n // 0}->@*, [$line, $.];
Структура данных теперь имеет дополнительный уровень структуры. Я уже мог определить порядок строк в метке и подсчитать, но теперь я знаю порядок строк во всей структуре данных. Если бы я хотел, я мог бы воссоздать ввод:
{
format => {
"0" => [["check script for formatting issues", 6]],
"1" => [["the file contains 1 formatting issues", 8]],
"5" => [["the file contains 5 formatting issues", 4]],
},
syntax => {
1 => [["there are 1 syntax issues with semicolon", 5]],
2 => [["2 syntax issues have been found", 7]],
5 => [
["there are 5 syntax issues with semicolon", 1],
["there are 5 syntax issues with commas", 2],
],
6 => [["6 syntax issues have been found", 9]],
11 => [["there are 11 syntax issues with semicolon", 3]],
},
}