#! perl -slw use strict; use threads; use Thread::Queue; our $BUFSIZE ||= 2**20; open my $fh, '+< :raw', $ARGV[ 0 ] or die $!; my $size = -s $fh; my $Qin = new Thread::Queue; my $Qout= new Thread::Queue; async { my $buffer; while( sysread $fh, $buffer, $BUFSIZE ) { $Qin->enqueue( $buffer ); sleep 1 while $Qin->pending > 10; } $Qin->enqueue( undef ); }->detach; my $Tout = async{ sleep 1 until $Qout->pending; sysseek $fh, 0, 0; while( my $out = $Qout->dequeue ) { syswrite $fh, $out; } }; sleep 1 until $Qin->pending; while( my $in = $Qin->dequeue ) { $in =~ tr[0*][*0]; $Qout->enqueue( $in ); } $Qout->enqueue( undef ); $Tout->join; close $fh;