perl - 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
是而不是5
我helper
会$date + 2
得到
helper($dt) #output: 7
helper($dt) #output: 9
helper($dt) #output: 11
而不是每个响应的预期 5。
在方法结束时我是否缺少一些步骤来重置这些变量?
解决方案
DateTime
创建一个参考。
因此,当您调用时,helper($dt)
您会将引用的副本传递给helper
. 它不会创建一个全新的 DateTime 对象。
您对传递的值所做的任何更改都会对您已经创建的单个 DateTime 对象进行。
如果要创建三个不同的 DateTime 对象,则需要调用DateTime->new
3 次。
推荐阅读
- r - 如何编写一个 for 循环来创建 50 个不同点之间的欧几里得距离矩阵?R
- dotnetnuke - 如何在 2SXC 中强制内容编辑通过 ADAM 上传图片?
- css - 如何正确地将样式应用于 SVG 类?
- random - 是否可以在 TI-Basic 中制作真正的随机数生成器?
- powershell - 在 jenkins 文件中编写 Powershell 或直接在 jenkins 中编写
- angular - 量角器测试在 Firefox 中失败,“HTTP 方法不允许”
- javascript - 有没有限制复选框类型选择的 jQuery 函数的替代方法?
- ruby-on-rails - “如何修复'错误:缺少必需的标志:»-a,--app APP应用程序运行命令'\”
- r - 在列表中查找对象的位置编号
- python - 关于动画中改变scatter的marker的问题