20

Perlでは、オブジェクトは、特定のクラスに祝福された基本的なPerlデータ型のいずれかへの単なる参照です。祝福されていない参照でref()関数を使用すると、参照が指すデータ型が通知されます。ただし、祝福された参照でref()を呼び出すと、参照が祝福されたパッケージの名前が返されます。

祝福された参照の実際の基礎となるタイプを知りたいです。どうすればこれを判断できますか?

4

3 に答える 3

20

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);
于 2008-09-15T15:54:08.240 に答える
6

おそらくこれを行うべきではありません。オブジェクトの基礎となる型は、いじってはならない実装の詳細です。なぜあなたはこれを知りたいのですか?

于 2008-09-05T12:18:09.637 に答える
2

そして、これについて私が最初に考えたのは、「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::定義
配列
于 2008-09-03T18:09:51.777 に答える