2013-03-15 4 views
0

stdin에서 레코드를 대화식으로 읽길 원합니다. CTRL + D는 레코드의 끝을 표시합니다. ctrl + c를 누를 때까지 영원히 계속됩니다. 내 코드에서 다음과 같은 오류가 발생하고 있습니다.STDIN에서 레코드를 읽는 중 초기화되지 않은 값 오류가 발생합니다

Use of uninitialized value in open 
Use of uninitialized value in <HANDLE> 

null 레코드를 건너 뛰려면 오류를 피할 수 있습니다. 그러나 나는 내가 이해하지 못하는 문제를 마스킹하는 것처럼 느낀다. 나는 stdin이 닫히고 있다고 생각한다. 그러나 나는 확실하지 않다. 오류가 발생하는 이유와 루프를 수정하는 방법을 설명 할 수 있습니까? format는 출력 파일 핸들의 이름과 매개 변수로 그림 형식을 기대로

my $eof = $INPUT_RECORD_SEPARATOR; 
while (1) { 
    local $INPUT_RECORD_SEPARATOR = chr(0x04); 
    my $rec = <STDIN>; 

    # format last record that ended with ^D 
    local $INPUT_RECORD_SEPARATOR = $eof; 
    open my $input, "<", \$rec;  
    my_formatting_func $input; 
    close $input; 
} 
+0

Ctrl + D는 EOF입니다. – choroba

+0

'format'? 파일 핸들에서? 이게 뭐라고 생각하니? – TLP

+0

실제 함수 이름을 다른 것으로 변경하고 싶었습니다. 나는 포맷이 실제 펄 함수라고 의심하지 않았다. –

답변

0

코드는, 어쨌든 작동하지 않습니다, 당신은 입력 파일 핸들 참조를 공급하고 있습니다.

그러나 문제는 Perl 프로그램이보기 전에 control-D가 C 라이브러리에 의해 처리된다는 것입니다. 이로 인해 스트림이 닫히고 이후에 readfile을 호출하면 undef이 반환됩니다.

그냥

last unless defined $rec; 

를 작성하고 당신은 완전한 입력 기록을 얻을 것이다. 무엇보다도, 일반적인 관용구를 사용하여 작성하십시오.

{ 
    my $eof = $INPUT_RECORD_SEPARATOR; 
    local $INPUT_RECORD_SEPARATOR; 
    while (my $rec = <STDIN>) { 
     local $INPUT_RECORD_SEPARATOR = $eof; 
     open my $input, "<", \$rec;  
     format $input; 
     close $input; 
    } 
} 
관련 문제