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