종료하기 전에 Perl이 마지막 텍스트를 인쇄하지 않는 이유는 무엇입니까?

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

  •  10-07-2019
  •  | 
  •  

문제

내 코드는 바로 마지막 줄을 실행하지 않습니다. " exit; "그리고 나는 이유가 없다. 나는 추가를 시도했다. printf $fh 전에 라인 exit, 그러나 그것은 작동하지 않았습니다. 어느 줄도 인쇄하지 않습니다. 출구 전에 마지막 인쇄문을 제외하고는 다른 모든 것을 잘 인쇄합니다.

왜 이런 일이 일어나는지 실마리? 아니면 더 나은 방법으로, 그 주변을 고치거나 작업하는 방법은 무엇입니까?

    if($i>0 && $i<3)
    {
        printf $fh "Partial match found.\n";
        if($matched_uid){printf $fh "UID #: ".$arguid." exists.\n";}
        if($matched_id){printf $fh "ID #: ".$argid." exists.\n";}
        if($matched_uname){printf $fh "Username: ".$arguname." exists.\n";}
        printf $fh "Aborting."; 
        exit;
    }

편집하다:
내가 복사 한 코드의 일부에는 이것을 포함했습니다

select $fh; $| = 1; #set auto flush

어쩌면 이것이 내 결과를 복제 할 수없는 이유입니다 ....

도움이 되었습니까?

해결책

"중단. n"시도

이것은 버퍼링 문제처럼 보입니다.

다른 팁

나는 주었다 R. Bemrose 내 투표이지만 $ fh가 a 파일 핸들 당신도 원할 수도 있습니다 close 종료하기 전에.

또한 사용 중입니다 printf 잘못. printf입니다 ~ 아니다 '파일 인쇄'. '인쇄 형식'.

그 마지막 예를 위해

  print $fh 'Message' ;  

필요한 전부입니다.

printf 따라서 사용되도록 의도된다 :

printf $fh 'some format %s  and more %s ' ,  $var , $var ; 

또는

   printf 'some format %s  and more %s ' ,  $var , $var ; 

그리고 그 일에 동등합니다

   print $fh sprintf 'format %s more %s' , $var , $var ; 

이로 인해, 당신은 당신의 연결된 변수가 그들에 '%'를 갖도록 확장 될 때 불필요한 코드 위험을 입력합니다. 이 함정에 빠지는 사람들의 예는 Q : 308417 : 왜 내 Perl 스크립트가 파일에서 문자를 제거합니까?

perldoc -f print

print FILEHANDLE LIST
print LIST
print   Prints a string or a list of strings.

perldoc -f printf

printf FILEHANDLE FORMAT, LIST
printf FORMAT, LIST
      Equivalent to "print FILEHANDLE sprintf(FORMAT, LIST)", except that "$\" 
      (the output record separator) is not appended

추가 조사

"버퍼링"조건이 발생할 수 없기 때문에 문제를 더 조사했습니다. 내 모든 파일이 플러시하든 아니든 모든 파일이 제대로 플러시됩니다. (Perl 5.10).

그녀는 내 코드 스 니펫을 시도하고 있습니다.

#!/usr/bin/perl 

use strict;
use warnings;


open my $fh , '>' , '/tmp/oo.txt'; 

my $exit_at = int(rand( 200_000 ));
print "$exit_at\n";
sleep 2;
for ( 0 .. ( $exit_at * 2 ) ){ 
    print $fh $_;
    if ( $_ == $exit_at ){
        printf $fh '%n' ; # Bad Code Causes Early Death. 
        printf $fh 'last line';
        exit; 
    }
    if ( $_ % 1000  ){
        print $fh "\n";
    }
}

나는 당신의 Miss-Cores of Printf를 사용하고 있습니다. 주석은 줄은 'n'매개 변수를 제공하지 않아 유효하지 않기 때문에 오류 메시지를 배출하고 다음과 함께 죽습니다.

Modification of a read-only value attempted at iotest.pl line 15.

'마지막 줄'을 실행하기 전에 출력 파일에 '마지막 줄'이없는 '마지막 줄'을 만들기 전에 '마지막 줄'을 만듭니다.

printf를 고치고 대신 평범한 프린트를 사용하고 문제가 해결되는지 확인하십시오.

Perl은 출력을 완충합니다. 당신은 자서전을 해제 할 수 있습니다

local $| = 1;

편집 : 나는 어떻게 든 쳤다! 대신 | 처음으로 ... 고정. 그 일이 어떻게 일어 났는지 모르고 키보드의 반대편에 있습니다.

적절한 사용의 주제에 print, 당신은 당신 자신에게 조금 열심히 만듭니다.

문자열을 함께 연결하는 대신 변수를 보간하십시오. 여러 문자열 대신 인쇄 할 문자열 목록과 함께 하나의 인쇄 문을 사용하십시오.

다음은 다음과 같습니다.

if( $i>0 && $i<3 )
{
    print $fh join "\n", 
        "Partial match found.",
        $matched_uid   ? "UID #: $arguid exists."      : (),
        $matched_id    ? "ID #: $argid exists."        : (),
        $matched_uname ? "Username: $arguname exists." : (),
        "Aborting.",
        ;

    exit;
}

그만큼 () 3 원 운영자의 잘못된 측면에는 빈 목록이 있으며, 결합 할 인수가 평평해질 때 사라집니다. 내가 사용했고 빈 줄 (''), 각각의 비 매칭 기준은 결과에 추가 빈 줄을 생성했을 것이다.

또한 각 항목에 자신의 Newline을 추가 한 다음 더 읽을 수 있다고 생각되면 조인을 건너 뛸 수 있습니다.

    print $fh  
        "Partial match found.\n",
        $matched_uid   ? "UID #: $arguid exists.\n" : '',
        ...

마지막 printf에 후행 n을 추가해야합니다. 그렇지 않으면 출력이 콘솔로 플러시되지 않습니다.

David Norman이 옳거나 문제는 다른 곳입니다. 방금 IF 블록 내부의 코드를 Perl 통역사로 입력 한 후 "잊어 버렸습니다". 예상대로. (신약 캐릭터 종료 없이도 저를 위해 일했습니다.)

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