1

PerlとDate::Dayを使用して、指定された日付を対応する曜日に変換しようとしています。

入力文字列の形式は次のとおり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; ERR; ERR;

4

2 に答える 2

5

Date::Dayはかなり古いモジュールのように見えます。最後に更新されたのはほぼ9年前です。それが壊れていると言っているわけではありませんが、最近の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
于 2011-10-25T12:25:14.347 に答える
3

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")
于 2011-10-25T09:00:23.410 に答える