Perlでは、オブジェクトは、特定のクラスに祝福された基本的なPerlデータ型のいずれかへの単なる参照です。祝福されていない参照でref()関数を使用すると、参照が指すデータ型が通知されます。ただし、祝福された参照でref()を呼び出すと、参照が祝福されたパッケージの名前が返されます。
祝福された参照の実際の基礎となるタイプを知りたいです。どうすればこれを判断できますか?
Scalar::Util::reftype()
最もクリーンなソリューションです。このScalar::Util
モジュールはバージョン 5.7 で Perl コアに追加されましたが、CPAN から古いバージョン (5.004 以降) で利用できます。
次を使用してプローブすることもできますUNIVERSAL::isa()
。
$x->isa('HASH') # if $x is known to be an object
UNIVERSAL::isa($x, 'HASH') # if $x might not be an object or reference
明らかに、型も確認する必要がARRAY
ありSCALAR
ます。UNIVERSAL モジュール (すべてのオブジェクトの基本クラスとして機能する) は、Perl 5.003 からコアの一部になっています。
もう 1 つの方法 (簡単ですが、少し汚い) は、参照を文字列化することです。クラスが文字列化をオーバーロードしていないと仮定すると、 に似たものが返さClass=HASH(0x1234ABCD)
れます。これを解析して、基になるデータ型を抽出できます。
my $type = ($object =~ /=(.+)\(0x[0-9a-f]+\)$/i);
おそらくこれを行うべきではありません。オブジェクトの基礎となる型は、いじってはならない実装の詳細です。なぜあなたはこれを知りたいのですか?
そして、これについて私が最初に考えたのは、「Perl のオブジェクトは常にハッシュ参照なので、何のハックなのか?」ということでした。
しかし、Scalar::Util::reftype が答えです。ここに質問を入れてくれてありがとう。
これを証明するためのコード スニペットを次に示します。
$> perl -e 'use strict; 警告「すべて」を使用します。 私の $x = [1]; 祝福 ($x, "ABC::Def"); Data::Dumper を使用します。ダンパー $x を印刷します。 ref($x) を出力します。"\n"; Scalar::Util "reftype" を使用します。reftype($x) を出力します。"\n"'`
出力:
$VAR1 = 祝福( [ 1 ], 'ABC::Def' ); ABC::定義 配列