Я работаю над небольшим DSL, который использует откат nomethod
для перегрузки для захвата операторов, используемых для перегруженных значений.Это похоже на функцию символьного калькулятора , описанного в документации overload
.
Это прекрасно работает для стандартных операторов сравнения, но учтите следующее:
my $ret = $overloaded =~ /regex/;
В этом случае nomethod
вызывается для строкового $overloaded
, и после этого перегрузка теряется.Я думал о возвращении связанной переменной, которая, по крайней мере, позволит мне носить с собой исходный перегруженный объект, но все равно будет потеряна во время выполнения регулярного выражения.
Итак, последний вопрос - есть лиспособ расширить представление overload
о символьном калькуляторе, включив в него операторы привязки регулярных выражений =~
и !~
, чтобы приведенный выше пример кода вызывал nomethod
с ($overloaded, qr/regex/, 0, '=~')
или чем-то подобным?
Я также кратко рассмотрел перегрузку оператора smartmatch ~~
, но, похоже, это тоже не помогло (всегда по умолчанию используется сопоставление с регулярным выражением, а не перегрузка).
Редактировать: я изучил ~~
и обнаружил, что my $ret = $overloaded ~~ q/regex/
работает из-за правил smartmatching.Близкое, но не идеальное решение, и я хотел бы, чтобы оно работало до 5.10, поэтому я приветствую другие ответы.