Эта проблема, по-видимому, аналогична известной проблеме rakudo для метода race
.
Я перешел с:
if $temp ~~ s:g/ (<$pattern>) /$color_red$0$color_off/ {
до:
if $temp ~~ s:g/ ($pattern) /$color_red$0$color_off/ {
и проблема, казалось, ушла.
Как позже упомянул Синь Чен и также описал в том же документе, более простая интерполяция соответствует буквально, как пояснено примерами из документа. Билет исправил проблему с чем-то вроде:
my $reg = regex { <$pattern> };
'' ~~ $reg;
ведет к обновленной программе с похожим обходным путем:
#!/usr/bin/env perl6
constant $color_red = "\e[31m";
constant $color_off = "\e[0m";
sub MAIN(Str $pattern, *@filenames){
my $channel = Channel.new();
$channel.send($_) for @filenames; # dir();
$channel.close;
my @workers;
# match seems required for pre-compilation
'' ~~ (my regex pat_regex { <$pattern> });
for 1..3 -> $n {
push @workers, start {
while (my $file = $channel.poll) {
do_something(&pat_regex, $file);
}
}
}
await(@workers);
}
sub do_something(Regex $pat_regex, Str $filename) {
# say $filename;
for $filename.IO.lines -> $line {
my Str $temp = $line;
if $temp ~~ s:g/ ($pat_regex) /$color_red$0$color_off/ {
say $filename ~ ": " ~ $temp;
}
}
}
Приношу свои извинения за ранее предложенное явное решение EVAL
, о котором лучше всего сказать, что мое описание требовало лучшего решения.