Same here, except that I never use Data::Dumper. I don't like to read output that intended for 'eval'. In the rare case that I want a complex structure to be printed out when debugging (usually, I'm only interested in a few values - scalar I just print, arrays I just interpolate), I use YAML whose output is much better human readable than Data::Dumper's.
And sometimes, I tie a variable to track the changes in its value.
I seldomly use gdb as well, but then, most C programs I write are pretty small. Most of the time I use gdb is when perl segfaults, and I want a stacktrace to send with a bug report.