В Perl 5 был стандартный прием, когда из нуля требовалось сделать логическую истину:
# Perl 5
my $value = '0 but true';
say 2 + $value; # 2
say 'OK' if $value; # OK
В Perl 6 такие трюки можно делать без привлечения строк — для этого есть инфиксный оператор but:
my $v = 0 but True; say $v; # 0 say ?$v; # True
Этот оператор подмешивает к объекту метод, имя которого совпадает с типом значения. В данном примере True это Bool, поэтому переменная $v получает метод Bool, возвращающий True. Теперь в булевом контексте (явно или неявно) переменная окажется истиной, хотя ее числовое значение продолжает быть нулем.
Аналогично можно подмешивать другие типы. Например, сказать, что число пи в виде строки это «примерно три»:
my $p = pi but 'примерно три'; say 0 + $p; say "Значение равно $p";
Здесь сложение с нулем важно, потому что иначе say попытается сразу преобразовать переменную в строку. Программа печатает следующее:
3.14159265358979 Значение равно примерно три
Нужно быть осторожным, если потребуется вывести значение с помощью метода perl. В текущей реализации это не работает, и альтернативное значение теряется:
$ perl6 -e'(0 but True).perl.say' 0
Я предложил вариант решения этой проблемы, посмотрим, что скажут основные разработчики.
Минимальная портабельная версия Perl6 какая ?
В смысле?