It's a cautionary cleanup in case you're passing garbage as parameters.
Perhaps you should use Scalar::Util::looks_like_number to confirm a numerical value.
I think you missed the "d" there :)
There is no letter 'd' in the line:
my $seconds = sprintf( "%02.3f", ( ( $sectime - ( $hours * 3600 )
+) - ( $minutes * 60 )) );
Update
Why not just:
my ( $hours, $minutes, $seconds ) = split /:/, $time;
Because I want that if you pass only one value, it defaults to seconds, and to minutes:seconds with only two values.
Then try it like this:
my ( $hours, $minutes, $seconds ) = ( split /:/, $time )[ -3, -2, -1 ]
+;