Как создать объект, который возвращает разные значения в разных скалярных контекстах?
Вопрос
Я хочу вернуть другое значение в строковом и числовом контексте, например $!
делает.Я знаю, что могу узнать, нахожусь ли я в списочном или скалярном контексте с помощью Wantarray, но есть ли способ в чистом Perl определить, в каком скалярном контексте я нахожусь?Я предполагаю, что в XS также есть ответ, и я готов принять этот ответ, если нет возможности сделать это на чистом Perl.
Решение
Проверьте Scalar::Util
модуль, в частности dualvar()
функция:
use Scalar::Util qw(dualvar);
my $scalar = dualvar 10, "Hello";
my $twelve = $scalar + 2; # $twelve = 12
my $greeting = $scalar . " world"; # $greeting = "Hello world"
Scalar::Util
является частью основного дистрибутива и должен быть доступен везде, где есть Perl.
Другие советы
Хотя я могу предложить случаи, когда это будет полезно (возможно, римские цифры), вам лучше создать объект с целым числом и строковым атрибутом.Используйте соответствующий атрибут в соответствующем контексте.
Это дает вам дополнительную гибкость, позволяя перегружать операции с помощью «использовать перегрузку».В примере с римскими цифрами функция Dualvar будет работать до тех пор, пока вы не захотите сложить две римские цифры вместе.