【发布时间】:2020-06-12 01:23:39
【问题描述】:
我确实有以下简单代码:
my $TimeZone = $hCache->{'TimeZone'}; # Cache gets filled earlier
my $DateTime = DateTime->now();
$DateTime->set_time_zone($TimeZone);
此代码在应用服务器中运行,该服务器基本上是一个长时间运行的 perl 进程,它接受传入的网络连接。
这个应用程序服务器有时会变得“脏”,上面的代码会打印以下错误:
DateTime::TimeZone::new 的“名称”参数(“Europe/Berlin”)是 一个“glob”,它不是允许的类型之一:标量 /srv/epages/eproot/Perl/lib/site_perl/linux/DateTime.pm 1960 行。
当我尝试调试变量“$TimeZone”时,我没有得到更多详细信息。
例如
print ref($TimeZone); # prints nothing (scalar?)
print $TimeZone; # prints "Europe/Berlin"
如果我再次将时区强制为字符串,则代码有效,如下所示:
my $TimeZone = $hCache->{'TimeZone'}; # Cache gets filled earlier
my $DateTime = DateTime->now();
$DateTime->set_time_zone($TimeZone."");
我的问题是:
- 如果 'glob' 不是引用,如何正确调试变量?
- 如何创建“glob”变量?它的语法是什么?我是 很确定我庞大的代码库中有一些意外,但我 不知道要搜索什么。
- 有没有办法“监控” 多变的?基本上,如果变量发生变化,就会得到一个堆栈跟踪
【问题讨论】:
-
ref(\$var)将返回GLOB以获得全局。例如,perl -e'$x = *STDOUT; CORE::say ref(\$x)' -
谢谢。您知道星号 (*) 是否始终是创建 GLOB 的方式吗?
-
*是 glob 的标志。*foo表示“当前包中名为foo的 glob”,就像$x指的是名为x的标量一样。