[Cascavel-pm] Slurp

Paulo paulo em odos.com.br
Quinta Janeiro 24 11:44:19 PST 2008


Eu conheço pouco perl mas concordo com o Nilson, principalmente se a 
questão for eficiência.
Embora tenha o custo de chamar um módulo para uma coisa que pode ser 
feita em poucas linhas, ler arquivos grandes mas que caibam na memória 
disponível pode ser lento.

O Slurp utiliza sysread com blocos (se você não alterar) de tamanho 
1048576 bytes.
A sysread é difícil de superar, além disso o módulo pode fornecer o 
retorno como uma referência o que evita a atribuição a um scalar.

Apenas como ilustração segue o trecho que define o tamanho default do 
bloco e o while com a chamada da sysread.
Retirado do fonte do módulo Slurp.pm.

...
$blk_size = $args{'blk_size'} || 1024 * 1024 ;
...
while( 1 ) {
    my $read_cnt = sysread( $read_fh, ${$buf_ref}, $size_left, length 
${$buf_ref} ) ;
       if ( defined $read_cnt ) {
           last if $read_cnt == 0 ;
           next if $blk_size ;
           $size_left -= $read_cnt ;
           last if $size_left <= 0 ;
           next ;
       }
       @_ = ( \%args, "read_file '$file_name' - sysread: $!");
       goto &_error ;
}



Mais detalhes sobre a lista de discussão Cascavel-pm