print map { chr hex } split /\s+/, $line x $nlines;
is problematic as it constructs a string of $nlines * length($nlines) bytes in memory before splitting and then printing it.
The most likely approach to fix this would be to convert the statement to a loop:
for my $repeat (1..$nlines) {
print map { chr hex } split /\s+/, $line;
}
I haven't tested this change, so you're advised to compare the results of the changed file to the results without the change before trusting the output.
Personally, I wonder how large your input hexdump and your output hexdump files are. Perl usually can handle strings up to 2GB without any problem, so likely your machine has less RAM than that. |