Aquí hago un regex manualmente a partir de Regex elementos de una matriz.

my Regex @reg =
  / foo /,
  / bar /,
  / baz /,
  / pun /
  ;

my $r0 = @reg[0];
my $r1 = @reg[1];

my Regex $r = / 0 $r0 | 1 $r1 /;

"0foo_1barz" ~~ m:g/<$r>/;
say $/;  # (「0foo」 「1bar」)

¿Cómo hacerlo con for @reg {...}?

2
Eugene Barsky 13 nov. 2017 a las 18:19

2 respuestas

La mejor respuesta

Si una variable contiene una expresión regular, puede usarla sin más preámbulos dentro de otra expresión regular.

El segundo truco es usar una variable de matriz dentro de una expresión regular, que es equivalente a la disyunción de los elementos de la matriz:

my @reg =
  /foo/,
  /bar/,
  /baz/,
  /pun/
  ;

my @transformed = @reg.kv.map(-> $i, $rx { rx/ $i $rx /});

my @match =  "0foo_1barz" ~~ m:g/ @transformed /;

.say for @match;
6
moritz 13 nov. 2017 a las 20:44
my @reg =
  /foo/,
  /bar/,
  /baz/,
  /pun/
  ;

my $i = 0;

my $reg = @reg
  .map({ $_ = .perl; $_.substr(1, $_.chars - 2); })
  .map({ "{$i++}{$_}" })
  .join('|');

my @match = "foo", "0foo_1barz" ~~ m:g/(<{$reg}>) /;

say @match[1][0].Str;
say @match[1][1].Str;

# 0foo
# 2baz

Consulte los documentos

Editar: En realidad, leo los documentos yo mismo. Se cambió la evaluación implícita a la construcción $ ().

Editar: reescribió la respuesta a algo que realmente funciona

Editar: respuesta cambiada a un terrible, terrible truco

3
Holli 13 nov. 2017 a las 20:36