Hi Zefram,

Thanks. Things are a lot clearer to me now.

Jagdish

On Nov 30, 2007 7:50 PM, Zefram <[EMAIL PROTECTED]> wrote:

> jagdish eashwar wrote:
> >I came across some unexpected behaviour in datetime. In the following
> >script, I first define $date1. Then I set $day1 = $date1. Then I add 2
> days
> >to $day1. Why does $date1 also get incremented?
>
> Because a DateTime object doesn't represent a date-and-time per se; it
> implements a variable that is typed to hold a date and time.  Walkthrough:
>
> >my $date1 = DateTime->new(year => 2007,
> >             month => 12,
> >             day => 23);
>
> You create a date/time variable, initialised as holding the date
> 2007-12-23.  You set $date1 to be a reference to that variable.
>
> >my $day1 = $date1;
>
> You copy the reference to the date/time variable from $date1 to $day1.
> Both of these Perl variables now refer to the same date/time variable.
>
> >$day1->add(days => 2);
>
> You reference the date/time variable (via $day1), and tell it to modify
> the date value that it holds by advancing it by two days.  The date/time
> variable now holds the date 2007-12-25.
>
> >print "day1 = ",$day1,"\n";   # gives me 2007-12-25 correctly.
>
> You reference the date/time variable (via $day1), and ask it to display
> the date that it holds (2007-12-25).
>
> >print "date1 = ",$date1,"\n";  # why does $date1 also change to
> 2007-12-25?
>
> You reference the date/time variable (via $date1), and ask it again to
> display the date that it holds (2007-12-25).
>
> The stage that should have rung alarm bells for you is
>
>        $day1->add(days => 2);
>
> where you're doing date arithmetic calling a method on an object and
> *ignoring its return value*.  This method operates by having a side effect
> on the object.  If, instead, DateTime objects actually represented dates
> and times per se, then there wouldn't be any of these side effects,
> and this step in the program (combined with the previous step) would
> instead be something like
>
>        my $day1 = $date1->plus(days => 2);
>
> As it is, you need to create a second date/time variable, initialised
> by copying the value from the first one.  So instead of
>
>        my $day1 = $date1;
>
> do
>
>        my $day1 = $date1->clone;
>
> Then the ->add call will side-effect this second date/time variable,
> the one referenced by $day1, and leave the original date/time variable,
> the one referenced by $date1, alone.
>
> -zefram
>

Reply via email to