繁体   English   中英

在Perl中,如何找到与给定日期相对应的星期几?

[英]In Perl, how can I find the day of the week which corresponds to a given date?

我正在尝试使用带有Date :: Day的 Perl将给定的日期转换为星期几。

输入字符串的格式为: October 24, 2011; March 12, 1989; November 26, 1940 October 24, 2011; March 12, 1989; November 26, 1940 October 24, 2011; March 12, 1989; November 26, 1940

我已经编写了一个脚本,它将解析以上输入并将每个日期转换为Date::Day::day()可以接受的格式。

该子例程接受格式为mm,dd,yyyy的输入。 我已经使用哈希完成了此操作。 最近在stackoverflow上的此查询上发布了一个线程,并在其他成员的帮助下,能够做到这一点。

这是我的脚本,它针对每个日期返回我ERR,而不是返回对应于该日期的星期几。

传递给day()子例程的参数的输入格式似乎有问题。

这是我正在使用的Perl模块的更多文档: http : //helpspy.com/cm/programming/lang/perl/cpan/c06/Date/Day/d_1/

我有兴趣知道,我到底在哪里出错。 在将日期作为参数传递给day()子例程之前,是否必须对日期进行一些修改?

#!/usr/bin/perl

use Date::Day;
use strict;
use warnings;

my @arr;

print "Enter the string: ";
my $str=<>;
chomp $str;

my @dates= split /; /,$str;

my %days= ("January",1,"February",2,"March",3,"April",4,"May",5,"June",6,"July",7,"August",8,"September",9,"October",10,"November",11,"December",12);

my @output = map {
my $pattern=$_;
$pattern =~ s/(\S*)\s/$days{$1}, /;
$pattern =~ s/\s//g;
$pattern
} @dates;

print &day(11,9,1987); # for test purpose and it returns correct value

foreach $output (@output)
{
chomp $output;
my $result=&day($output);
push(@arr,$result);
}

foreach my $arr (@arr)
{
print $arr."; ";
}

上面脚本的输出是:ERR; 呃; 呃;

Date :: Day看起来像是一个很旧的模块。 最后更新时间大约是九年前。 并不是说它已经坏了,但是如今, DateTime系列模块几乎可以处理您想要的任何日期/时间处理。 我强烈建议您改为看看这些。

这是一个使用DateTime :: Format :: Strptime解决您的问题的示例。

#!/usr/bin/perl

use strict;
use warnings;
use 5.010;

use DateTime::Format::Strptime;

my $dt_parser = DateTime::Format::Strptime->new(
  pattern => '%B %d, %Y'
);

while (<DATA>) {
  chomp;

  my $dt = $dt_parser->parse_datetime($_);

  say $dt->day_name;
}

__END__
October 24, 2011
March 12, 1989
November 26, 1940

您正在将一个字符串传递给sub &day

这是一个重写:

#!/usr/local/bin/perl 
use Data::Dump qw(dump);
use strict;
use warnings;
use Date::Day;

print "Enter the string: ";
my $str=<>;
chomp $str;

my @dates= split /; /,$str;

my %days = ("January",1,"February",2,"March",3,"April",4,"May",5,"June",6,"July",7,"August",8,"September",9,"October",10,"November",11,"December",12);

my @output = map {
    my @l = split/[ ,]+/;
    $l[0] = $days{$l[0]};
    [@l];
} @dates;

my @arr;
foreach my $date(@output) {
    push @arr, &day(@$date);
}
dump@arr;

输出:

("MON", "SUN", "TUE")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM