Pergunta

Meu código não será executado a última linha direita antes "exit;" e eu não tenho idéia por que. Eu tentei colocar uma linha printf $fh adicional antes exit, mas isso não quer trabalhar; ele não iria imprimir uma linha. Tudo impressões else bem, exceto as últimas declarações de impressão antes da saída.

Qualquer idéia por que isso acontece? Ou ainda melhor, como corrigir ou contornar isso?

    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;
    }

EDIT:
Parte do código de Copiei continha este

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

Talvez seja por isso que meus resultados não poderiam ser duplicados ....

Foi útil?

Solução

Tente "Abortar. \ N"

Isto parece uma questão buffering.

Outras dicas

Eu dei Bemrose meu voto, mas se $ fh é um ARQUIVO PUNHO você pode querer também close-lo antes de terminação.

Além disso, você está usando printf erroneamente. printf é não 'arquivo de impressão'. seu 'formato de impressão'.

Para esse último exemplo

  print $fh 'Message' ;  

É tudo que você precisa.

printf se destina a ser usado assim:

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

ou

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

e sua equivelant a fazer

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

E por causa disto, você está colocando código desnecessário riscos em caso qualquer de suas variáveis ??concatenadas expandir para ter '%' neles. Para um exemplo de pessoas que caem nesta armadilha, consulte : 308417:? Por que meus personagens remove Perl script a partir do arquivo

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

Além disso Sondagem

Eu tenho sondando o seu problema ainda mais porque eu não posso obter a sua condição de "buffering" de ocorrer. Todos os meus arquivos estão devidamente lavada ou não eu lave-os. (Perl 5,10).

Aqui está o meu código snippet Eu estou tentando:

#!/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";
    }
}

Eu estou usando o miss-uso de printf. A linha que é comentado ejetado uma mensagem de erro, porque o seu devido não é válido para ninguém fornecendo o parâmetro 'n', e ele morre com:

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

Antes de executar print 'última linha' (também ruim, mas não há nenhum símbolo% nele assim sua multa) fazendo ausente 'última linha' a partir do arquivo de saída.

Por favor, corrija o seu printf e usar plain-old-print vez e ver se isso resolve o seu problema.

Perl buffers sua saída. Você pode desligar autobuffering com

local $| = 1;

Edit: eu de alguma forma bater! em vez de | pela primeira vez ... fixo. Não faço ideia como isso aconteceu, eles estão em lados opostos do teclado.

Sobre o tema do uso adequado de print, você faz as coisas um pouco duro consigo mesmo.

Interpolate suas variáveis ??em vez de concatenar as cordas juntos. Use uma declaração de impressão com uma lista de strings para imprimir, em vez de múltiplas cadeias.

Aqui está uma maneira:

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;
}

O () no lado falsa do operador ternário é uma lista vazia, que irá desaparecer quando os argumentos para se juntar são achatadas. Se eu tivesse usado e string vazia (''), cada critério de não-correspondência teria produzido uma linha em branco nos resultados.

Você também pode adicionar seu próprio nova linha em cada item, e depois saltar a juntar-se, se você sentir este é mais legível:

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

Você precisa adicionar uma fuga \ n para o último printf. Caso contrário, a saída não fica liberado para o console.

De qualquer David Norman é certo, ou o problema está em outro lugar. I acabou de digitar o código dentro do bloco if no interpretador perl, e impresso "Abortar". como esperado. (Ela trabalhou para mim mesmo sem o caractere de nova linha de terminação.)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top