Well now, strictly speaking, you could do this in the main thread, if the program never has anything else to do. The main thread could be the one that contains the loops aforementioned. For a daemon-program that does not interact with anyone or anything else, that might be just fine.
The main “take aways” are: (1) the notion of a signal as a wakeup-call, and of not attempting to do anything substantial in them; (2) the notion that signals are not one-to-one paired with work requests and might in some cases get dropped; (3) the notion that the main loop might run a few extra times with nothing to do, provided that, thereby, it is assured never to “sleep through” the signal that is its appointed purpose in life.
If you use a thread, it will run truly-concurrently with the main, and all the usual shared-variable caveats apply. Unlike, say, Ruby, these are “real” operating-system threads. Fortunately, Perl’s implementation is (mostly ... *wink!*) friendly.