이 Perl 조각에서 'undef'가 감지되지 않는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/843405

  •  20-08-2019
  •  | 
  •  

문제

undef 값으로 인해 두 번째 'if' 문의 블록이 입력될 것으로 예상하지만 로그에는 블록이 입력되지 않은 것으로 표시됩니다.

sub getcmd{
  my $self = $_[0];
  if ( $self->_recv == OK ){
      push @{$self->{'log'}}, ['NOTICE', "OK"];
      return "My command";          
  }
  push @{$self->{'log'}}, ['ERROR', "Did not get OK back"];
  return undef;
}

...

if (!($ret = $self->getcmd)){
  push @{$self->{'log'}}, ['ERROR', "failed to read after asking for NEXT"];
}
else {
  push @{$self->{'log'}}, ['ERROR', "'undef' not detected in next()"];
}

로그 파일에는 다음이 표시됩니다.

[Fri May  8 19:25:56 2009]: ERROR: Did not get OK back
[Fri May  8 19:26:02 2009]: ERROR: 'undef' not detected in next()

어떤 아이디어라도 감사히 받아들입니다.

편집하다: 죄송합니다. 기본 흐름을 보여주기 위해 코드를 편집했습니다.좀 더 잘 교정했어야 했는데.

  • 반환 값을 캡처하는 데 항상 사용되는 전역 변수인 $ret의 현재 값을 인쇄하는 로깅 함수에서 발생하는 상황을 시뮬레이션하기 위해 getcmd()에 $ret를 추가했습니다.
  • 로그 메시지를 정리하고 추가 "뒤로"를 놓쳤습니다.

제안과 의견에 감사드립니다.나는 로그 타임스탬프에서 6초의 차이를 발견하지 못했기 때문에 실행 순서가 원래 예상했던 것과 다르다는 것이 맞다고 생각합니다.

나는 돌아가서 다시 살펴볼 것이다."월요일에 실행해야 하는" 프로젝트를 위해 하루 13시간 동안 작업을 완료한 후 다른 사람의 "평균" Perl을 보려고 할 때 얻을 수 있는 결과가 바로 이것이라고 생각하세요!

저는 코드를 작성하지 않고 그냥 상속받았습니다.이 코드는 "악취나는 경고나 엄격한 규정이 필요하지 않다"고 생각하는 두 사람에 의해 작성되었습니다.

800줄의 Perl과 많은 'ifs'가 있지만 else 문은 없다고 상상해 보세요!방어 코딩이 전혀 없습니다!8-O

귀하의 도움에 다시 한 번 감사드립니다.

건배,

도움이 되었습니까?

해결책

여기서는 뭔가 더 복잡한 일이 벌어지고 있는 것 같습니다. 해당 로그 메시지는 6초 간격으로 보이는데 push 문, 반환 및 if 확인에 6초가 걸릴 리가 없습니다.

첫 번째 로그 메시지가 애플리케이션의 다른 위치에서 이전에 메서드를 호출하여 나온 것일 가능성이 있습니까?

다른 팁

최소한으로 줄이면 "undef detector"가 인쇄됩니다.

#!/bin/perl -w

use strict;

sub getcmd
{
    return undef;
}

my $ret;

if (!($ret = getcmd()))
{
    print "undef detected\n";
}
else
{
    print "undef undetected\n";
}

결과적으로, $self->getcmd()가 undef를 반환해야 한다고 생각함에도 불구하고 문제가 발생할 가능성이 높습니다.

사용 펄 디버거 (perl -d) 코드를 단계별로 진행하여 무슨 일이 일어나고 있는지 확인합니다.코드를 디버깅할 때 모든 가정에서 벗어나는 것이 중요합니다.

또한, 다음 라인은 모든 Perl 프로그램 위에 필수입니다:

use strict;
use warnings;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top