首页 > 解决方案 > Perl 变量范围似乎不合作

问题描述

我所有的变量都按照以下my $var格式声明。

在我的程序中,我调用mainMethod()

然后在mainMethod我定义一个 DateTime 变量,然后将它传递给一个单独的辅助方法 3 次:

 my ($day,$month,$year)=(localtime)[3,4,5];
 my $dt = DateTime->new(
    year      => $year,
    month     => 2 + $month,
    day       => 1,
    hour      => 8,
    minute    => 30,
    time_zone => 'America/New_York'
);
helper($dt, $year, $month, $day,);
helper($dt,$year, $month, $day,);
helper($dt,$year, $month, $day,);

helper我开始:

my $date = $_[0];
my ($year, $month, $day) = ($_[1],$_[2],$_[3]);

这种方法做了很多不同的事情,但我做的唯一改变$date$date = $date->add(days => (3 - $date->day_of_week) % 7);

问题是,似乎我$date在辅助方法中所做的更改,每次我调用该方法时都会持续存在mainMethod注意:我没有返回任何东西

例如,如果$dt是而不是5helper$date + 2得到

helper($dt) #output: 7
helper($dt) #output: 9
helper($dt) #output: 11

而不是每个响应的预期 5。

在方法结束时我是否缺少一些步骤来重置这些变量?

标签: perlscope

解决方案


DateTime创建一个参考

因此,当您调用时,helper($dt)您会将引用的副本传递给helper. 它不会创建一个全新的 DateTime 对象。

您对传递的值所做的任何更改都会对您已经创建的单个 DateTime 对象进行。

如果要创建三个不同的 DateTime 对象,则需要调用DateTime->new3 次。


推荐阅读