3

おそらく簡単な答え: 外部モジュールをインポートせずにこれを変換するにはどうすればよいですか? CPAN を読みましたが、次のことを行うメソッドを明示的に特定できませんでした。

Convert: 20080428 to 28-APR-08

何か案は?

チュートリアルに案内していただければ幸いです。

よろしく、PIAS

4

3 に答える 3

3

このコードは Y10k で失敗しますが、それで十分です。正規表現はより厳密になる可能性がありますが、日付が既に検証されている (または新しい形式で検証される) 場合は問題ありません。

#!/usr/bin/perl

use strict;
use warnings;

my @mon = qw/null JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC/;

my $d = "20080428";

$d =~ s/..(..)(..)(..)/$3-$mon[$2]-$1/;

print "date is now $d\n";

または、気が狂って正規表現で検証したい場合 (Perl 5.10 が必要):

#!/usr/bin/env perl5.10.0

use strict;
use warnings;

my @mon = qw/null JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC/;

my $d = join '', @ARGV;

# only validates between 1600 and 9999
# because of calendar weirdness prior to 1600 
$d =~ s/
    ^
    (?:
        # non-leap years and everything but 29th of Feb in leap years
        (?:
            1[6-9]     (?<y> [0-9]{2}) | 
            [2-9][0-9] (?<y> [0-9]{2})
        )
        (?: #any month 1st through 28th
            (?: (?<m> 0[1-9] | 1[0-2]) (?<d> 0[0-9] | 1[0-9] | 2[0-8]) )
            | #or 30th of any month but 2
            (?: (?<m>0[13-9] | 1[0-2]) (?<d> 30) )
            | # or 31st of 1, 3, 5, 7, 8, 10, or 12
            (?: (?<m>0[13578] | 1[02]) (?<d> 31) )
        )
        | # or 29th of Feb in leap years
        (?:
            (?: #centuries divisible by 4 minus the ones divisible by 100
                16          |    
                [2468][048] |
                [3579][26]
            )
            (?<y> 00)
            | #or non-centuries divisible by 4
            (?: 1[6-9] | [2-9][0-9] )
            (?<y>
                0[48]       | 
                [2468][048] |
                [13579][26]
            )
        )
        (?<m> 02) (?<d> 29)
    )
    $
/$+{y}-$mon[$+{m}]-$+{d}/x or die "invalid date: $d";

print "date is now $d\n";
于 2009-05-06T16:38:03.230 に答える
2

これらのアドレス http://www.go4expert.com/forums/showthread.php?t=15533 とこの perl ドキュメント http://perldoc.perl.org/functions/localtime.htmlを確認しましたか?

于 2009-05-06T15:09:42.223 に答える
2
my %map = ( '01' => 'JAN', '02' => 'FEB', '03' => 'MAR', '04' => 'APR' ); # You can do the rest yourself ;-)
my $in = '20080428';
if ( $in =~ m/..(..)(..)(..)/ ) {
    my ( $y, $m, $d ) = ( $1, $2, $3 );
    my $out = sprintf '%02d-%s-%02d', $d, $map{$m}, $y;
}   
else {
    die "Illegal date format";
}   
于 2009-05-06T16:03:48.180 に答える