my $longuest_sig_len = ...; my $block_size = 4096; $block_size = int(($longuest_sig_len + 1023) / 1024) if $block_size < $longuest_sig_len; local $/ = \$block_size; my $block = ''; while (<$fh>) { $block = substr($block, -($longuest_sig_len-1)) . $_; ... search for signature in $block ... }