문제

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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top