2011-03-03 8 views

답변

9

Perl은 파이썬이나 루비의 방식과 달리 문자열과 숫자를 구별하지 않습니다. Perl에서는 연산자를 사용하여 변수의 해석 방법을 결정합니다.

파이썬에서는 1 + 2을 쓸 때 파이썬은 각 인수의 유형을 확인하고 숫자임을 확인한 다음 추가 (3)를 수행합니다. '1' + '2'을 쓰면 두 문자열 모두를보고 연결을 수행합니다 ('12'). 1 + '2'을 쓰면 유형 오류가 발생합니다.

Perl에서 1 + 2을 쓸 때 + 연산자는 해당 인수에 숫자 컨텍스트를 적용합니다. 각 인수는 숫자로 변환되고 (인수가 깔끔하게 변환 될 수없는 경우 후속 경고가 있음) 추가가 수행됩니다 (3). '1' + '2'을 작성하면 인수는 여전히 3의 결과를 갖는 숫자로 변환됩니다.

연결을 원할 경우 연산자 인 1 . 2을 사용하면 두 인수가 모두 숫자 임에도 불구하고 '12'이됩니다.

Perl 연산자가 형식 해석을 강제하므로 변수 자체에 형식이 필요하지 않으며 형식을 포함하지 않습니다.어느 것이 어떤 것인지를 정말로 결정할 필요가 있다면, Scalar::Utillooks_like_number 함수를 사용할 수 있지만 일반적으로 Perl에서의 코딩은 디자인 문제를 나타냅니다. 프리미티브 유형의 참조를 할 수

  • 번호
  • 문자열
  • 부정 값 (undef)
  • 참조 (:

    펄 스칼라 변수는 4 가지 중 하나를 포함 할 수있다 또는 객체에)

ref 키워드는 스칼라에 참조가 포함되어 있으면 해당 참조가 어떤 유형인지를 나타냅니다.

ref(1)   --> '' (a false value) 
ref('string') --> '' (a false value) 
ref([1, 2, 3]) --> 'ARRAY' 
ref({a => 1}) --> 'HASH' 
ref(\1)  --> 'SCALAR' 
ref(\\1)  --> 'REF' 
ref(sub {}) --> 'CODE' 

전체 목록

그 참조 대상이되고, perldoc -f ref

기준 패키지에 bless 인 ED에서 찾을 수있다. 이 경우 ref은 객체가 축복받은 패키지의 이름을 반환합니다.

{package My::Object; 
    sub new {bless {}} 
} 

my $obj = My::Object->new; 

ref($obj) --> 'My::Object' 
6

시도 ref.

+0

어떻게해야합니까? – Tshepang

+0

@Tshepang 어떻게해야합니까? 뭐라 구요? – hobbs

+0

@hobbs'type (value)'과 같은 것? – Tshepang

1

당신이 뭔가 당신이 시도 할 수 정수가 있는지 확인하려면 다음

use Scalar::Util; 

if (defined $value 
    && !ref $value 
    && ref \$value eq 'SCALAR' 
    && Scalar::Util::looks_like_number($value) 
    && $value =~ /^-?[0-9]+$/msx 
) { 
    printf '%s is an integer', $value; 
} 
+0

문자열은 어떻게됩니까? – Tshepang

+11

@Tshepang 객체가 아닌 것은 문자열이거나 또는 문자열 일 수 있습니다. 숫자 포함. 객체 인 일부 객체도 문자열이 될 수 있습니다. 잘못된 질문을 그만 두십시오. – hobbs

+0

@hobbs * 잘못된 질문 *을 중지 하시겠습니까? 그게 무슨 뜻이야? – Tshepang

3
당신은 대상이 특정 클래스에 속한다 (하지만 당신이 물어 있는지 여부를 테스트하기 위해 'ISA'를 사용할 수 있습니다

그것이 무엇인지는 아닙니다.) 'ref'는 참조가 어떤 데이터 유형인지, 참조가 전혀 없는지 알아내는 데 사용할 수 있습니다.

AFAIK, 타이핑은 펄에서와 똑같은 것을 의미하지 않기 때문에 실제 동등한 것은 없습니다.

4
  • Params::Util::_POSINT은 스칼라가 양의 정수인지 확인하는 좋은 표준 방법입니다. 스칼라는 _INTEGER 기능이없는 이유를 잘 모르겠어요 양의 정수 또는 0

경우

  • Params::Util::_NONNEGINT을 확인하는 좋은 방법입니다.

    개체 인을 다루는 경우 현대적인 확인 방법은 Scalar::Util::blessed입니다. ref은 수행하지만 unblessed 참조에는 값을 리턴하지 않습니다. (어느 펄에입니다있는 개체를.)


    펄과 TIMTOWTDI (YMMV)의 아름다움은 당신이 스니핑 방법을 결합하여 당신이 원하는 무엇을 만들 수 있다는 것입니다. 모듈에 고정시키고 재사용하십시오.

  • 관련 문제