Я хотел бы использовать функцию comb
Раку с регулярным выражением из грамматики вместо отдельного регулярного выражения. Например, в следующем коде, который анализирует журналы journalctl
со стандартного ввода, я хотел бы заменить &h
в MAIN
чем-то вроде &Journalctl::full_log
:
role Log {
token preamble { ... };
token message { <-preamble>* };
regex full_log { <preamble> <message> };
}
grammar Journalctl does Log {
token date { \S+\s\d\d\s\d\d\:\d\d\:\d\d};
token hostname { \S* };
token ctl_unit { <-[\[]>+ };
token pid { \d+ };
regex preamble { <date> <.ws> <hostname> <.ws> <ctl_unit> \[ <pid> \]\: };
}
sub MAIN( ) {
my regex h { h. };
for $*IN.comb(&h) -> $wof { # FIXME
say $wof;
}
}
Вот несколько примеров journalctl
журналов для справки:
Jun 25 14:45:54 cpu-hostname systemd-timesyncd[725]: Initial synchronization to time server 185.125.190.56:123 (ntp.ubuntu.com).
Jun 25 14:45:54 cpu-hostname systemd-resolved[722]: Clock change detected. Flushing caches.
Я предлагаю вам попробовать это:
my &h = rx/<Journalctl::full_log>/;
Это сработало.
my regex h { <Journalctl::full_log> };
тоже сработало.