Bra*_*rad 3 perl datetime readonly
我有一个Perl脚本试图将一些配置DateTime和DateTime::Duration实例设置为Readonly常量.但是,当我们尝试对这些对象进行数学运算时,我会看到奇怪的行为Readonly.这是一个最小的例子:
#!/usr/bin/perl -w
use strict;
use warnings;
use DateTime;
use Readonly;
Readonly my $X => DateTime->now;
my $x = DateTime->now;
Readonly my $Y => DateTime::Duration->new( days => 3 );
my $y = DateTime::Duration->new( days => 3 );
my $a = $X - $Y;
my $b = $x - $y;
print "$a\n";
print "$b\n";
Run Code Online (Sandbox Code Playgroud)
在我的系统(OSX上的Perl 5.10.0)上显示:
$ ./datetime_test.pl
Argument "2011-07-12T20:36:08" isn't numeric in subtraction (-) at ./datetime_test.pl line 15.
-4305941629
2011-07-09T20:36:08
Run Code Online (Sandbox Code Playgroud)
所以它看起来像制作DateTime及DateTime::Duration Readonly原因无法正常运作.这是一个错误吗?或者我使用Readonly错了?我也试过Readonly::Scalar和Readonly::Scalar1,两者的行为方式相同.
问题是它们是对象(引用),而不是普通的标量.您需要Readonly引用中包含的值,而不是引用本身; 但事实证明这很棘手.像这样的东西似乎工作:
use Readonly;
use DateTime;
# you can't just say "Readonly %$dt"; here at least, it dies on blessed refs
sub makeRO {
my $dt = shift;
while (my ($k, $v) = each %$dt) {
Readonly $dt->{$k} => $v;
}
}
my $x = DateTime::Duration->new(days => 3);
makeRO($x);
my $y = DateTime::Duration->new(days => 3);
my $a = $x - $y;
# print "$a\n"; # this isn't overloaded; you'll get "DateTime::Duration=HASH(...)"
print $a->days, "\n";
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
250 次 |
| 最近记录: |