On 10/11/2009, at 12:46 PM, Dave Rolsky wrote:

On Tue, 10 Nov 2009, Dan Horne wrote:

The "die { found => 1 };" instruction sets $@ tp "HASH(0xac2a148) at /usr/local/lib/perl5/site_perl/5.10.0/DateTime/TimeZone/Local/ Unix.pm line 115" and hence there is never a $...@->{found}.

What version of DT::TZ? As of 0.92, all uses of $@ should be cleanly local-ized before they are used, so they shouldn't be leaking.

I'm using 1.03. $@ is indeed localised. I don't think anything is leaking. It seems to me that $@ is simply stringyfying the hash, and appending the line number where the error is occurring (i.e. line 115), but I don't know why.


Why it works for some calls and not this particular instance, I'll never know. After bashing my head trying to solve the problem for a couple of days, I have a simple workaround which is undoubtedly more efficient anyway, but which doesn't solve the underlying problem:

 our $TZ = DateTime::TimeZone->new( name => 'local' );
 sub now {
     my $self = shift;
     return DateTime->now(time_zone => $TZ);
 }

This is a really good idea _anyway_. Calculating the local time zone is slow, and it's really unlikely to change over the lifetime of your app. Calculate it once and cache it.


Indeed. The workaround is sufficient for my needs. And if no one cares about why the problem is occurring (why it arises when one module calls DateTime->now but not others), I'm more than happy to let things go!

Reply via email to