-1

我的脚本以格式传递了一个日期参数,YYYYMMDD例如20130227。我需要检查是否是星期一。如果是,那么我需要检索前四天的日期值,否则我应该检索前两天的日期值并将它们存储在数组中。

例如,如果参数是 20130227 星期一,那么我需要存储('20130227' '20130226' '20130225' '20130224') 在一个数组中。如果不是星期一,那么我只需要存储('20130227' '20130226') 在一个数组中。

我可以使用什么 perl 函数来执行此操作?我在 solaris 10 上使用 perl。

4

3 回答 3

3

并非所有标准 Perl 命令都列在标准 Perl 命令列表中。system这对初学者来说是一个很大的困惑,也是您最终看到初学者使用大量命令来完成可以直接在 Perl 中完成的事情的主要原因。

如果您包含该命令的Perl 模块,则可以使用许多 Perl 命令。例如,您想将文件从一个地方复制到另一个地方,但没有将 Perlcopy命令列为标准功能。许多人最终会这样做:

 system ("cp $my_file $new_location");

但是,有一个标准的 Perl 模块File::Copy,其中包含缺少的复制命令:

 use File::Copy;

 copy ($my_file, $new_location);

File::Copy模块包含在 Perl 中,但您必须了解模块以及如何使用它们。不幸的是,尽管它们是 Perl 的主要部分,但它们根本没有包含在许多 Perl 初学者书籍中。

我假设您的困惑来自您在 Perl 中寻找某些命令但没有找到它的事实。然而,Time::Piece模块是自 Perl 5.10 以来用于日期操作的标准 Perl 模块。不幸的是,它是一个面向对象的模块,对于不熟悉面向对象 Perl 的用户来说,它的语法可能会有点奇怪。幸运的是,它使用起来真的非常简单。

在面向对象编程中,您创建一个包含数据的对象。对象本身不容易显示,但包含数据的所有特征,并且可以使用各种方法(基本上是子例程)来获取有关该对象的信息。

您需要做的第一件事是创建日期的时间对象

 my $time_obj = Time::Piece->strptime("20130227", "%Y%m%d");

现在,$time_obj代表您的日期。代表您的20130227日期字符串。%Y%m%d表示您的字符串 ( YYYYMMDD)的格式。不幸的是,Time::Piece文档没有告诉您格式是如何工作的,但格式字符记录在Unix strftime 手册页中。

一旦你有了你的时间对象,你可以用各种方法(又名子程序)来查询它:

if ( $time_obj->day_of_week == 1 ) {
    print "This is a Monday\n";
}

阅读文档并尝试一下。

于 2013-03-18T19:31:42.480 回答
1

在 Perl 中处理日期的通用工具包是DateTime模块。它带有大量的日期解析选项,可以让您输入和输出您的字符串格式,并且可以轻松查询例如星期几。

一个更轻量级、快速和推荐的替代方案可能是Date::ISO8601- 您的格式非常接近该 ISO 格式,但您需要愿意对变量进行一些操作,例如my ($yyyy, $mm, $dd) = ( substr($d, 0,4), substr( $d, 4, 2 ), substr( $d, 6, 2 ) );将从您的示例中获取年月日字符串到提供给模块的构造函数。

请至少尝试一下,如果您遇到困难,请在您的问题上发布一些代码。一旦您在问题中尝试了一些代码,只需填写您不知道的部分,别人就可以更快地回答 - 您可能比您想象的更了解您想要的解决方案!

于 2013-03-18T09:38:07.760 回答
0

我并不热衷于帮助那些自己似乎没有为他们付出努力的人。所以我不打算给你答案,但我建议你看一下 Time::Piece 模块(Perl 5.10 版以来的标准部分)。尤其是它的strftime方法。

这应该足以让你开始。

于 2013-03-18T11:28:18.853 回答