-2

率直に言って、私はPerlをまったく知りません。いくつかの理由でperlを使用して問題を解決する必要があります。簡単な解決策を探してみましたが、見つかりませんでした(私の悪い)

問題:ファイル名とタイムスタンプ(つまり2012-05-24T18:19:35.000Z)のリストを含むファイルがあります。これらのうち、90日以上経過しているものを解析して特定する必要があります。

私はただチェックが必要です、私が私がすでに持っていると思う他のすべて。私がグーグルで検索したとき、いくつかの提案が-Mの使用に関するものであったのに対し、いくつかの人々はいくつかの豪華な日時パッケージを使用することを提案しました。

実際にはかなり混乱しています。すべての助けに感謝します。ありがとう。

4

4 に答える 4

4

この形式は、RFC3339(より具体的に)とISO8601(他の多くの中で)の両方で定義されています。

use strict;
use warnings;
use feature qw( say );

use DateTime                  qw( );
use DateTime::Format::RFC3339 qw( );

my $limit_dt = DateTime->now->subtract( days => 90 );

my $format = DateTime::Format::RFC3339->new();
while (<>) {
   chomp;
   my ($timestamp, $filename) = split(' ', $_, 2);
   my $dt = $format->parse_datetime($timestamp);
   say($filename) if $dt < $limit_dt;
}

例えば、

$ cat data
2012-05-24T18:19:35.000Z new
2012-02-25T18:19:35.000Z old
2012-02-24T18:19:35.000Z ancient

$ perl script.pl data
ancient

時間の部分を無視して、日付の部分が90日以上前であるかどうかを確認するには、代わりに次を使用します。

my $limit_dt = DateTime->today( time_zone => 'local' )->subtract( days => 90 );
于 2012-05-24T19:28:40.970 に答える
3

この日付形式には、これらの文字列の2つを辞書式に比較することは、日時の比較を行うことと(ほぼ)同じであるという利点があります。したがって、90日前の日付をその形式に変換し、文字列比較を行う必要があります。

use POSIX 'strftime';
$_90_days_ago = strftime("%FT%T.000Z", gmtime( time-90*86400 ));

...
foreach $date (@your_list_of_dates) {
    if ($date lt $_90_days_ago) {
        print "$date was at least 90 days ago.\n";
    } else {
        print "$date is less than 90 days ago.\n";
    }
}
于 2012-05-24T19:51:45.760 に答える
0

このようなものが機能するはずです:

#! perl -w

use strict;
use Time::Local;

# 90 times 24 hours of 60 minutes, 60 seconds
my $ninety_days = 24 * 60 * 60 * 90;
my $now = time;

# parse the time stamps in the file
while (<INPUTFILE>)
{
    chomp();

    if (/(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})/)
    {
        my $year = $1;
        my $month = $2;
        my $day = $3;
        my $hour = $4;
        my $minute = $5;
        my $second = $6;

        # Looks like these are in GMT ("Z") so we'll use timegm
        my $time = timegm($second,$minute,$hour,$day,$month - 1,$year - 1900);

        if (($now - $time) > $ninety_days)
        {
            print "$_ is more than 90 days ago!
        }
    }
}

(これは基本的なことです。データファイルを開くための詳細などが必要です)

于 2012-05-24T19:29:23.827 に答える
-1

このPerlモジュールhttps://metacpan.org/pod/Date::Manipを確認する必要があります

于 2012-05-24T19:22:00.830 に答える