2009-04-29 2 views
4

$!のように文字列コンテキストと数値コンテキストで異なる値を返したいとします。私はwantarrayでリストまたはスカラーコンテキストにいるのかどうかを知ることができますが、純粋なPerlでは、私がどのスカラーコンテキストにいるかを決める方法はありますか?私はXSにも答えがあると仮定し、純粋なPerlでそれを行う方法がない場合、その答えを喜んで受け取ります。異なるスカラーコンテキストで異なる値を返すオブジェクトを作成するにはどうすればよいですか?

答えて

13

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を持っているavaliableでなければなりません。

+0

ありがとう、それは私が必要とするものです。私は本当にコアをやり直す必要があります。私が忘れてしまった、または知らなかった、あまりにも多くの良いことがあります。 –

2

これは有用な(Roman Numeralsのような)場合を提案できますが、整数と文字列属性を持つオブジェクトを作成するほうがよいでしょう。適切なコンテキストで適切な属性を使用します。

これにより、 'use overload'を使用して操作をオーバーロードできる柔軟性が向上します。ローマ数字の例では、2つのローマ数字を一緒に追加するまで、dualvarは機能します。