Как мне создать объект, который возвращает разные значения в разных скалярных контекстах? - PullRequest
4 голосов
/ 29 апреля 2009

Я хочу вернуть другое значение в строковом и числовом контексте, как $!. Я знаю, что могу узнать, нахожусь ли я в списке или в скалярном контексте с помощью wantarray, но есть ли способ в чистом Perl определить, в каком скалярном контексте я нахожусь? Я предполагаю, что в XS также есть ответ, и я готов принять этот ответ, если нет способа сделать это на чистом Perl.

Ответы [ 2 ]

13 голосов
/ 29 апреля 2009

Проверьте модуль 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.

3 голосов
/ 02 мая 2009

Хотя я могу предложить случаи, когда это будет полезно (возможно, римскими цифрами), было бы лучше создать объект с целым числом и строковым атрибутом. Используйте соответствующий атрибут в соответствующем контексте.

Это дает вам дополнительную гибкость, позволяя перегрузить операции с помощью 'use overload'. В примере с римскими цифрами dualvar будет работать до тех пор, пока вы не захотите добавить 2 римские цифры вместе.

...