open my $in, '<:raw', 'infile.dat' or die $!; open my $out, '>:raw', 'outfile.dat' or die $!; # reading with a bigger block size is much more efficient # than byte by byte reading local $/ = \1024; while (<$in>) { my $copy = $in; $copy =~ s/\x00/\x17/g; print $out $copy; } close $in or die $!; close $out or die $!;