Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I create an object that returns different values in different scalar contexts?

Tags:

perl

scalar

I want to return a different value in string context and numeric context like $! does. I know I can find out whether I am in list or scalar context with wantarray, but is there any way in pure Perl to determine which scalar context I am in? I assume there is an answer in XS as well and I am willing to take that answer if there is no way do it in pure Perl.

like image 274
Chas. Owens Avatar asked Dec 06 '22 06:12

Chas. Owens


2 Answers

Check out the Scalar::Util module, specifically the dualvar() function:

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 is part of the core distribution, and should be avaliable anywhere you have Perl.

like image 121
Chris Lutz Avatar answered Dec 28 '22 06:12

Chris Lutz


While I can propose cases when this would be useful (maybe Roman Numerals), you would be better off creating an object with an integer and a string attribute. Use the appropriate attribute in the appropriate context.

This gives you the added flexibility of being able to overload operations with 'use overload'. In a Roman Numerals example, dualvar will work until you want to add 2 roman numerals together.

like image 40
Craig Lewis Avatar answered Dec 28 '22 06:12

Craig Lewis