Je travaille sur un petit DSL qui utilise le fallback nomethod
pour surcharger afin de capturer les opérateurs utilisés sur les valeurs surchargées. Ceci est similaire à la fonction de symbolic calculator décrite dans la documentation overload
.Existe-t-il un moyen de surcharger l'opérateur de liaison de regex `= ~` en Perl?
Cela fonctionne très bien pour les opérateurs de comparaison standard, mais considérer les points suivants:
my $ret = $overloaded =~ /regex/;
Dans ce cas, nomethod
est appelé à stringify $overloaded
, et après que la surcharge est perdue. J'ai pensé renvoyer une variable attachée, ce qui me permettra au moins de contourner l'objet surchargé original, mais cela sera encore perdu pendant l'exécution de l'expression rationnelle.
Ainsi, la question ultime est de savoir s'il y a un moyen d'étendre l'idée de » overload
d'une calculatrice symbolique pour inclure les opérateurs de liaison regex =~
et !~
, de sorte que l'échantillon de code ci-dessus appellerait nomethod
avec ($overloaded, qr/regex/, 0, '=~')
ou quelque chose de similaire?
J'ai également brièvement examiné la surcharge de l'opérateur smartmatch ~~
mais cela ne semble pas non plus faire l'affaire (toujours par défaut pour l'appariement d'expressions rationnelles plutôt que de surcharges).
Modifier: J'ai regardé dans ~~
plus, et a constaté que my $ret = $overloaded ~~ q/regex/
fonctionne en raison de règles smartmatching. Fermer, mais ce n'est pas une solution idéale, et j'aimerais que cela fonctionne avant le 5.10, alors j'accueille d'autres réponses.
Je suppose que la fourniture d'un wrapper au moteur regex ne fonctionnerait pas non plus si vous voulez que cela fonctionne avant 5.10. –
Fin de la folie! Apprenez Python! – bukzor
@bukzor: Je suis sûr que vous ne pouvez pas surcharger l'opérateur de liaison de regex en Python, car il n'en a pas. Bien sûr, vous pourriez écrire une classe qui vous donnerait des fonctionnalités similaires, limitées: http://code.activestate.com/recipes/302498-re-match-and-replace-through-operator-overloading/ –