[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