gpt4 book ai didi

perl - 如何在 Perl 中创建只读 DateTime 和 DateTime::Duration

转载 作者:行者123 更新时间:2023-12-01 23:25:38 27 4
gpt4 key购买 nike

我有一个 Perl 脚本试图将一些已配置的 DateTimeDateTime::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";

在我的系统(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

因此看起来使 DateTimeDateTime::Duration Readonly 导致它们无法正常运行。这是一个错误吗?还是我使用的 Readonly 错了?我还尝试了 Readonly::ScalarReadonly::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";

关于perl - 如何在 Perl 中创建只读 DateTime 和 DateTime::Duration,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6670890/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com