В Perl, как я могу найти день недели, который соответствует данной дате? - PullRequest
1 голос
/ 25 октября 2011

Я пытаюсь преобразовать данные даты в соответствующие дни недели, используя Perl с Дата :: День .

Входная строка имеет формат: October 24, 2011; March 12, 1989; November 26, 1940.

Я написал скрипт, который будет анализировать вышеуказанные входные данные и преобразовывать каждую дату в формат, который будет принят Date::Day::day().

Эта подпрограмма принимает входные данные в формате mm,dd,yyyy.Я сделал это с помощью хэшей.Недавно разместил ветку по этому запросу в stackoverflow и с помощью других участников смог это сделать.

Вот мой скрипт, и он возвращает мне ERR для каждой из дат вместо того, чтобы возвращать день недели, соответствующийна сегодняшний день.

Кажется, что-то не так с форматом ввода параметра, передаваемого в подпрограмму day ().

Вот еще документация по модулю Perl, который я использую: http://helpspy.com/c.m/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;ERR;ERR;

Ответы [ 2 ]

5 голосов
/ 25 октября 2011

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
3 голосов
/ 25 октября 2011

Вы передаете строку в подпрограмму &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")
...