Perl에서 축복받은 참조 유형을 어떻게 확인할 수 있습니까?
문제
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부터 핵심의 일부였습니다.
또 다른 방법(쉽지만 약간 지저분함)은 참조를 문자열로 만드는 것입니다.클래스가 문자열화를 오버로드하지 않았다고 가정하면 다음과 같은 결과를 얻게 될 것입니다. Class=HASH(0x1234ABCD)
, 기본 데이터 유형을 추출하기 위해 구문 분석할 수 있습니다.
my $type = ($object =~ /=(.+)\(0x[0-9a-f]+\)$/i);
다른 팁
아마 이렇게 하면 안 될 것 같아요.객체의 기본 유형은 함부로 다루어서는 안 되는 구현 세부 사항입니다.왜 이것을 알고 싶습니까?
그리고 이것에 대한 나의 첫 번째 생각은 다음과 같습니다."Perl의 개체는 항상 해시 참조입니다. 그렇다면 해킹은 무엇입니까?"
하지만 Scalar::Util::reftype이 답입니다.여기에 질문을 올려주셔서 감사합니다.
이를 증명하는 코드 조각은 다음과 같습니다.(누구에게나 유용한 경우).
$> perl -e 'use strict; use warnings "all"; my $x = [1]; bless ($x, "ABC::Def"); use Data::Dumper; print Dumper $x; print ref($x) . "\n"; use Scalar::Util "reftype"; print reftype($x) . "\n"'`
산출:
$VAR1 = bless( [ 1 ], 'ABC::Def' ); ABC::Def ARRAY