The following snippet turns a number of seconds to a compact string representing the
equivalent amount of seconds in weeks, days, hours, minutes and seconds. This is
useful for reporting elapsed time in an easily-graspable human-readable format (just
how many weeks or days 123 456 789 seconds anyway)?
Update: That was changed a little bit too much, as grinder correctly remarked ... nevertheless, my main concern were those ugly string interpolations, and I think this works:
$res .= sprintf "%dw", $weeks if $we
$res .= sprintf "%dd", $days if $days or $we
$res .= sprintf "%dh", $hours if $hours or $days or $we
$res .= sprintf "%dm", $minutes if $minutes or $hours or $days or $we
$res .= sprintf '%ds', $seconds;
Yes they could, but it would change the behaviour of the routine. For instance, 86401 would produce 1d1s instead of 1d0h0m1s.
Which may be what you want (ultra-compact!), but it wasn't what I needed.
update: re your update: you're quite right. Adding the $res into the format string is a bit too clever by half. I completely overlooked .= . It's feedback
like this that make Perl Monks such a useful site.
The following code is a bit more complex. Sorry. But it produced output reflecting the amount of seconds. If something runs short, it says 3 seconds. If something takes longer, it says 1 hour, 3 seconds. If it takes even longer, the script can say 1 year, 3 monhts, 12 weeks, 4 days, 1 hour, 3 minutes, 20 seconds.
The code is implemented as a runtime tracker.
Well, hopefully it takes those 12 weeks and changes that into 2 more months :-)
As a very minor nit, the definitions of year and month may need to be adjusted depending on just how precise one wants to be. There are several definitions/equivalencies for the exact length of a year located here.
For example, using the current Sidereal year's approximation as 365.2564, a month is more accurately said to be 365.2564/12 or 30.438 rather than 30.5, and a year based on 30.5 * 12 is 366 days long...