そのため、perl5porters は、安全な逆参照演算子を追加して、次のようなものを許可することについて議論しています。
$ceo_car_color = $company->ceo->car->color
if defined $company
and defined $company->ceo
and defined $company->ceo->car;
に短縮する
$ceo_car_color = $company->>ceo->>car->>color;
ここで$foo->>bar
を意味しdefined $foo ? $foo->bar : undef
ます。
質問:この演算子を取得するモジュールまたは目立たないハック、または視覚的に快適な構文を持つ同様の動作はありますか?
参考までに、私が思いついたアイデアを挙げておきます。
複数のデリファレンス方法 (見た目が悪い)。
sub multicall { my $instance = shift // return undef; for my $method (@_) { $instance = $instance->$method() // return undef; } return $instance; } $ceo_car_color = multicall($company, qw(ceo car color));
すべての関数呼び出しから
undef
返されるプロキシ オブジェクト (さらに醜く見える) に変わるラッパー。undef
{ package Safe; sub AUTOLOAD { return undef } } sub safe { (shift) // bless {}, 'Safe' } $ceo_car_color = safe(safe(safe($company)->ceo)->car)->color;
ceo()
、car()
およびの実装にアクセスできるのでcolor()
、これらのメソッドから安全なプロキシを直接返すことを考えましたが、既存のコードが壊れる可能性があります。my $ceo = $company->ceo; my $car = $ceo->car if defined $ceo; # defined() breaks
残念ながら、安全なプロキシ
perldoc overload
の意味をオーバーロードすることdefined
については何もわかりません。//