Mam te dwa fragmenty kodu, które moim zdaniem powinny być równoważne. Pierwszy używa <|w>
aby określić granicę słowa, w której powinien znajdować się znak inny niż słowo (lub początek łańcucha) H. Drugi przykład wykorzystuje <<
, który powinien zrobić to samo.
my $string = "Hamadryas perlicus";
say $string ~~ /
<?after <|w> Hamadryas s+ >
(w+)
/;
say $string ~~ /
<?after << Hamadryas s+ >
(w+)
/;
Pierwszy pasuje, ale drugi nie:
「perlicus」
0 => 「perlicus」
Nil
Czy jest jakaś inna różnica między tymi dwoma?
Odpowiedzi:
3 dla odpowiedzi № 1Ta odpowiedź autorstwa timotimo na kanale IRC daje wskazówkę, dlaczego tak się dzieje. Kiedy używasz after
, w rzeczywistości przerzucasz wyrażenie regularne. Następnie musisz obrócić w prawo w lewo, a to zadziała.
use v6;
my $string = "Hamadryas perlicus";
say $string ~~ /
<?after Hamadryas <|w> s+ >
(w+)
/;
say $string ~~ /
<?after Hamadryas « s+ >
(w+)
/;
To da ci to, czego szukasz.