Я запустил небольшой домашний проект для анализа файлов журнала для Team Fortress 2. В файлах журнала есть событие в каждой строке, например:
L 10/23/2009 - 21:03:43: "Mmm... Cycles!<67><STEAM_0:1:4779289><Red>" killed "monkey<77><STEAM_0:0:20001959><Blue>" with "sniperrifle" (customkill "headshot") (attacker_position "1848 813 94") (victim_position "1483 358 221")
Обратите внимание, что есть некоторые общие части синтаксиса для файлов журнала. Например, имена состоят из четырех частей: имени, идентификатора, идентификатора Steam и команды игрока на тот момент. Вместо того, чтобы переписывать этот тип регулярных выражений, я надеялся немного абстрагироваться.
Например:
my $name = qr/(.*)<(\d+)><(.*)><(Red|Blue)>/
my $kill = qr/"$name" killed "$name"/;
Это работает хорошо, но регулярное выражение теперь возвращает результаты, которые зависят от формата $name
(ломая абстракцию, которую я пытаюсь достичь). Пример выше будет соответствовать как:
my ($name_1, $id_1, $steam_1, $team_1, $name_2, $id_2, $steam_2, $team_2)
Но я действительно ищу что-то вроде:
my ($player1, $player2)
Где $ player1 и $ player2 будут кортежами предыдущих данных. Я полагаю, что «убитому» событию не нужно знать точно об игроке, если у него есть информация для создания игрока, что и обеспечивают эти кортежи.
Извините, если это немного странно, но, надеюсь, вы сможете дать какой-нибудь совет!