Indeed so: CRs can sneak in and ruin your day.
Looking at: $_ =~ s/[\r\n]+\z//s ; makes me twitch a bit, since the values of "\r" and "\n" can vary. However, the best known case of "\n" ne "\x0A" is (old) Mac systems where "\n" eq "\x0D" and "\r" eq "\x0A" , so [\r\n] appears safe. [Nevertheless, I haven't found anything that guarantees that "\n" and "\r" are duals. perlport touches on systems where they aren't ASCII at all, but that's a whole other world of pain.]
Anyway, I favour: $_ =~ s/\s+\z// ; on the basis that it finesses the issue and gets rid of any other trailing whitespace -- two birds, one stone.
Mind you, I have seen "\s" defined to be [ \t\n\r\f] -- but current perlreref says it's "whitespace".