>>314
あ、文字列の最後が改行じゃなかった場合にマッチしなかったのね。これでいいかな?
($str) = $str =~ /^((?:.*(?:\n|\z)){0,$limit})/;

Perl神の>>316氏にもプレゼント。
($str) = $str =~ /^((?:[^\x0D\x0A]*(?:\x0D\x0A|[\x0D\x0A]|\z)){0,$limit})/;

Benchmark: timing 100000 iterations of 316, ore...
  316: 3 wallclock secs ( 3.96 usr + 0.00 sys = 3.96 CPU) @ 25278.06/s (n=100000)
  ore: 2 wallclock secs ( 1.65 usr + 0.00 sys = 1.65 CPU) @ 60532.69/s (n=100000)

>326
ストップウォッチ