But of course, there is no reason to ever use \Z (uppercase)--because you can just use \z (lowercase) and specify the \n in your regex:
/$my_regex \n \z/xms
...which makes it clearer what you are doing.
When you are having regex problems, the first thing you want to do is nail down what is in your string:
my $str = "123dog\n";
say "-->$str<--";
--output:--
-->123dog
<--
Or, to reveal the ord() of each character in the string:
printf "%vd", $my_str;
--output:--
49.50.51.100.111.103.10
#6 ascii chars in '123dog', but outputs 7 codes.
#Checking an ascii chart for the code 10:
#line feed. Ah hah, I forgot to chomp()
#the string!