arrays - 取消引用日期

标签 arrays perl datetime

我有一个小脚本,我想在其中返回两个日期之间的日期数组。

问题是添加的标量是通过引用,我如何存储副本或取消引用的值

#!/usr/bin/perl

use strict;
use warnings;
use DateTime;

my $now        = DateTime->today;
my $start_date = DateTime->today;
$start_date = $start_date->subtract( days => 45 );

my @dates;
while ( $start_date <= $now ) {
    push @dates, $start_date;
    $start_date->add( days => 1 );
}

my $date;
foreach (@dates) {
    print $_->ymd('/'), "\n";
}

最佳答案

您可以在将对象插入数组时克隆该对象,如下所示

my @dates;

while ( $start_date <= $now) {
   push @dates, $start_date->clone;
   $start_date->add( days => 1 );
}

foreach (@dates) {
  print $_->ymd('/'), "\n";
}

但如果您只想要每个日期的 YMD 字符串,那就太浪费了。你可以直接插入它

my @dates;

while ( $start_date <= $now) {
   push @dates, $start_date->ymd('/');
   $start_date->add( days => 1 );
}

print "$_\n" for @dates;

您可以通过处理数组本身的元素来更简单地设置数组,如下所示

my @dates = (DateTime->today);
unshift @dates, $dates[0]->clone->subtract(days => 1) for 1 .. 45;

但最终使用 Time::Piece 更简洁,而且可能更快做同样的事情。它是一个核心模块,因此如果您的 perl 副本是最新的,则不需要安装,它远小于 DateTime。 , 并且可能更快

use strict;
use warnings;

use Time::Piece;
use Time::Seconds 'ONE_DAY';


my @dates = map { localtime() - $_ * ONE_DAY } reverse 0 .. 45;

print $_->ymd('/'), "\n" for @dates;

输出

2014/07/24
2014/07/25
2014/07/26
2014/07/27
2014/07/28
2014/07/29
2014/07/30
2014/07/31
2014/08/01
2014/08/02
2014/08/03
2014/08/04
2014/08/05
2014/08/06
2014/08/07
2014/08/08
2014/08/09
2014/08/10
2014/08/11
2014/08/12
2014/08/13
2014/08/14
2014/08/15
2014/08/16
2014/08/17
2014/08/18
2014/08/19
2014/08/20
2014/08/21
2014/08/22
2014/08/23
2014/08/24
2014/08/25
2014/08/26
2014/08/27
2014/08/28
2014/08/29
2014/08/30
2014/08/31
2014/09/01
2014/09/02
2014/09/03
2014/09/04
2014/09/05
2014/09/06
2014/09/07

更新

要在数组中存储字符串而不是 Time::Piece 对象,您可以这样写

use strict;
use warnings;

use Time::Piece;
use Time::Seconds 'ONE_DAY';

my $today = localtime;
my @dates = map { ($today - $_ * ONE_DAY)->ymd('/') } reverse 0 .. 45;

print "$_\n" for @dates;

输出与前面程序的输出相同。

关于arrays - 取消引用日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25710422/

相关文章:

Ruby,组合数组中的项目?

perl - 如何在 Perl 字符串的开头插入三个字节?

javascript - 如何从日期字符串中获取日期(2 位数字)

php - 如何通过从 PHP 中的当前时间减去以前的时间戳来获得以分钟为单位的持续时间?

Java - 从列表/数组中的每个对象获取单个属性的最简单方法?

c++ - 如何在 C++ 中使用构造函数(只是构造函数)初始化类中的大型私有(private)数组?

arrays - 如果组的总和至少为 K,则从数组中选择元素的方法数

javascript - 如何将 perl 哈希转换为 javascript 哈希

python - 困惑的记录 - 字段内容内的分隔符

python - Pandas 数据框 : group by year and month