2017-01-07 1 views
1

perl 모듈 Bio :: Perl에 의해 객체가 만들어 졌는지 확인하려고 할 때 "정의되지 않은 값에 'xxxx'메서드를 호출 할 수 없습니다."와 같은 오류가 발생합니다.개체의 특성에 값이 있는지 확인하는 방법은 무엇입니까?

속성에 값이 있는지 여부를 확인하는 일반적인 방법이 있습니까?

if ($the_object->the_attribute) { 

그러나만큼 속성이 "미확정"있는 그대로, 메서드를 호출하는 것은 단지 나에게 오류 메시지를 줄 것이다 : 내가 좋아하는 뭔가를 좋아하는 것이다. 필자는이 문제에 대한 해결책을 찾을 수 없었습니다. 왜냐하면 객체가 Bio :: Perl 모듈에 의해 생성되고 일부 속성이 설정 될 수도 있고 설정되지 않을 수도 있기 때문입니다. 어쩌면 나는 perl-objects-savvy가 아니라고 덧붙여 야 할 것이다.

편집 : 다음은 내 코드의 관련 부분입니다. get_sequence() 함수는 Bio :: Perl 모듈에 있습니다. 13 행에서 길이를 확인하기 전에 값 (이 경우 시퀀스)이 있는지 확인하려면 어떻게해야합니까?

my @msgs; 
my @sequence_objects; 
my $maxlength = 0; 

for (@contigs) { 

    my $seq_obj; 

    try { 
     $seq_obj = get_sequence('genbank', $_); 
    } 
    catch Bio::Root::Exception with { 
     push @msgs, "Nothing found for $_ "; 
    }; 

    if ($seq_obj) { 

     my $seq_length = length($seq_obj->seq); 

     if ($seq_length > $maxlength) { 
      $maxlength = $seq_length; 
     } 

     push @sequence_objects, $seq_obj; 
    } 
} 

... 
+0

아니요. obj가 만들어 졌는지 확인하고 있지 않습니다. 당신은'$ the_object-> the_attribute'의 반환 값을 검사하고 있으며,'$ the_object'는 객체가 아니라'undef'라는 에러 메시지를 의미합니다. '$ the_object '가 어디서 왔는지, 그리고 어떤 속성이 있어야하는지 등) 좀 더 많은 코드를 포함한다면, 나는 나의 대답을 다듬을 수있다. – simbabque

답변

6
if ($the_object->the_attribute) { 

이 검사 방법 the_attribute의 반환 값이 참일 경우. 0이 아니며 빈 문자열 q{} 또는 undef이 아님을 의미합니다.

하지만 개체가 있는지 여부를 알고 싶다고 말했습니까?

일부 기본 내용은입니다.

# | this variable contains an object 
# |   this arrow -> tells Perl to call the method on the obj  
# |   | this is a method that is called on $the_object 
# |   | |   
if ($the_object->the_attribute) { 
# (      ) 
# the if checks the return value of the expression between those parenthesis 

몇 가지 혼란스러워합니다.

먼저 $the_object이 개체로 간주됩니다. 아마도 다음과 같은 호출에서 온 것입니다 :

my $the_object = Some::Class->new; 

또는 다른 함수 호출에서 반환되었을 수 있습니다. 어쩌면 다른 어떤 물건이 그걸 돌려 줬을거야.

my $the_object = $something_else->some_property_that_be_another_obj 

지금 the_attribute는 개체에있는 데이터의 특정 부분을 반환하는 방법 (즉 함수처럼)입니다. 클래스의 구현 (객체의 구축 계획)에 따라 해당 속성이 설정되지 않은 경우 (으로 초기화 됨) 단지 undef 또는 다른 값을 반환 할 수 있습니다.

그러나 표시되는 오류 메시지는 the_attribute과 관련이 없습니다. 만약 그렇다면 블록에서 코드를 호출하면 안됩니다. if 수표는 그것을 포착하여 else으로 가고, 아니면 else이 없으면 아무 것도하지 않기로 결정했습니다.

undef의 메서드를 호출하려고하고있다는 오류 메시지가 표시됩니다. $the_object에서 the_attribute 접근 방법이라고 부르는 것을 알고 있습니다. 따라서 $the_objectundef입니다.


뭔가 그냥 if에 넣어하는 것입니다 진정한 가치를 가지고 있는지 확인하는 가장 쉬운 방법. 그러나 당신은 이미 그것을 알고있는 것 같습니다.

if ($obj) { 
    # there is some non-false value in $obj 
} 

이제 $obj이 사실인지 확인했습니다. 그래서 그것은 대상이 될 수 있습니다. 이제 당신은 당신의 방법을 부를 수 있습니다.

if ($obj && $obj->the_attribute) { ... } 

$obj의 진정한 다움을 확인하고 $obj에 뭔가가있는 경우에만 계속됩니다. 그렇지 않은 경우 &&의 오른쪽을 절대로 호출하지 않으므로 오류가 발생하지 않습니다.

그러나 $obj이 메서드가있는 개체인지 확인하려면 can을 사용할 수 있습니다. 속성은 객체 내부에 저장된 값에 대한 접근 자 메소드 일뿐입니다. $obj이없는 경우

if ($obj->can('the_attribute')) { 
    # $obj has a method the_attribute 
} 

그러나 그것은 날려 버릴 수 있습니다.

$obj이 실제로 개체인지 확실하지 않으면 Safe::Isa 모듈을 사용할 수 있습니다. 어쩌면 어쩌면 개체에 안전하게 메서드를 호출하는 데 사용할 수있는 $_call_if_object 메서드를 제공합니다.

$maybe_an_object->$_call_if_object(method_name => @args); 

귀하의 전화는로 번역됩니다.

my $the_attribute = $obj->$_call_if_object('the_attribute'); 
if ($the_attribute) { 
    # there is a value in the_attribute 
} 

당신이 안전 :: 사에서 $_isa$_can을 사용할 수있는 동일한 방법.


1) 네, 방법은 정말하는 $와 변수를 있어요 시작합니다. 이 작동 방식 및 이유에 대해 자세히 알고 싶다면 You did what? by mst.

+0

나는 오리지널 오류 메시지가 (존재하지 않는) 객체와 관련되어 있어야하고 오히려 그 방법과 관련이 없어야한다는 오해가 있거나 혼합되었다는 것을 알았습니다. 당신의 철저한 설명에 많은 감사드립니다! – keeg

관련 문제