This may be complete Cargo Cult on my part, but it works on IIS and on Apache (FreeBSD and Linux), and it works for a variety of browsers on a variety of platforms. The idea is to first replace <cr><lf> with a platform newline sequence, then convert any lingering <cr>s. (I've not tried this out on a Mac-based web server.)
$query->param('textarea') =~ s/\r\n/\n/g;
$query->param('textarea') =~ s/\r/\n/g;