その場合、Perl はどのようにして exit が数値パラメータを期待していることを知るのでしょうか?
exitは仕様の一部である数値を期待しており、整数以外の値を渡した場合の動作は未定義のようです (つまり、そうすべきではありません。
さて、この特定のケースでは、 dualvarはどのようにしてコンテキストに応じていずれかの値の型を返すのでしょうか?
Scalar::Util のdualvarがどのように実装されているかはわかりませんが、代わりにオーバーロードで同様のものを書くことができます。
祝福されたオブジェクトの動作を変更することができます:
#!/usr/bin/env perl
use strict;
use warnings;
{package Dualvar;
use overload
fallback => 1,
'0+' => sub { $_[0]->{INT_VAL} },
'""' => sub { $_[0]->{STR_VAL} };
sub new {
my $class = shift;
my $self = { INT_VAL => shift, STR_VAL => shift };
bless($self,$class);
}
1;
}
my $x = Dualvar->new(31,'Therty-One');
print $x . " + One = ",$x + 1,"\n"; # Therty-One + One = 32
ドキュメントから、オーバーロードは実際に宣言スコープ内の動作を変更するように見えるため、任意のオペランドに対してローカルでいくつかの一般的な演算子の動作を変更できるはずです。
exitがこれらのオーバーロード可能な操作のいずれかを使用してそのパラメーターを整数に評価する場合、このソリューションで実行できます。
Java で行うように、サブルーチンのパラメーターのデータ型を定義する方法がわかりませんでした。
すでに他の人が言ったように... これは Perl には当てはまりません。少なくともコンパイル時には、サブルーチンプロトタイプを除いてそうではありませんが、これらはあまり型の粒度を提供しません (int と文字列または異なるオブジェクト クラスのように)。
Richard は、実行時に使用できるいくつかの代替手段について言及しています。パフォーマンスの低下を気にしないのであれば、個人的にMooseをお勧めします。