要求 - 我的文件名称为“Rajesh.1202242219”。数字只是日期“date '+%y''%m''%d''%H''%M'
”格式。
现在我正在尝试编写一个perl脚本来从文件名中提取数字并与当前系统日期和时间进行比较,并根据此比较的输出,使用perl打印一些值。
方法
从文件名中提取数字:
if ($file =~ /Rajesh.(\d+).*/) {
print $1;
}
将此时间转换为perl中的可读时间
my $sec = 0; # Not Feeded
my $min = 19;
my $hour = 22;
my $day = 24;
my $mon = 02 - 1;
my $year = 2012 - 1900;
my $wday = 0; # Not Feeded
my $yday = 0; # Not Feeded
my $unixtime = mktime ($sec, $min, $hour, $day, $mon, $year, $wday, $yday);
print "$unixtime\n";
my $readable_time = localtime($unixtime);
print "$readable_time\n";
查找当前时间并进行比较......
my $CurrentTime = time();
my $Todaydate = localtime($startTime);
但问题是,我没有获得如何从$1
中提取2位数并分配到$sec
,$min
等的解决方案。任何帮助?
此外,如果您对此问题声明有好的方法,请与我分享
答案 0 :(得分:7)
我喜欢使用时间对象来简化逻辑。我在这里使用Time::Piece因为它简单而且重量轻(并且是核心的一部分)。 DateTime可以是另一种选择。
use Time::Piece;
my ( $datetime ) = $file =~ /(\d+)/;
my $t1 = Time::Piece->strptime( $datetime, '%y%m%d%H%M' );
my $t2 = localtime(); # equivalent to Time::Piece->new
# you can do date comparisons on the object
if ($t1 < $t2) {
# do something
print "[$t1] < [$t2]\n";
}
答案 1 :(得分:5)
不妨教DateTime ::Format::Strptime使比较更加简单:
use DateTime qw();
use DateTime::Format::Strptime qw();
if (
DateTime::Format::Strptime
->new(pattern => '%y%m%d%H%M')
->parse_datetime('Rajesh.1202242219')
< DateTime->now
) {
say 'filename timestamp is earlier than now';
} else {
say 'filename timestamp is later than now';
};
答案 2 :(得分:3)
my ($year, $month, $day, $hour, $min) = $file =~ /(\d{2})/g;
if ($min) {
$year += 100; # Assuming 2012 and not 1912
$month--;
# Do stuff
}
答案 3 :(得分:2)
我认为unpack
可能更合适。
if ( my ( $num ) = $file =~ /Rajesh.(\d+).*/ ) {
my ( $year, $mon, $day, $hour, $min ) = unpack( 'A2 A2 A2 A2 A2', $num );
my $ts = POSIX::mktime( 0, $min, $hour, $day, $mon - 1, $year + 100 );
...
}
答案 4 :(得分:2)
使用分析日期的模块可能会很好。此代码将解析日期并返回DateTime对象。请参阅documentation以了解操作此对象的多种方法。
use DateTime::Format::Strptime;
my $date = "1202242219";
my $dt = get_obj($date);
sub get_obj {
my $date = shift;
my $strp = DateTime::Format::Strptime->new(
pattern => '%y%m%d%H%M'
);
return $strp->parse_datetime($date);
}