我有这个PERL Switch ..case声明:
switch ($today)
{
case "14-Aug-2012" { do A }
case "15-Aug-2012" { do B }
}#end switch
我的问题是2012年8月15日的“做B”声明与2012年10月1日相同。我如何说这些日期之间的情况,所以我不必在不同的日子里重写相同的东西并使我的脚本变长?
我已经放入了整个脚本,所以有人可以帮助我使用我所拥有的来管理我的问题。
use Date::Calc
use Switch
#connect to database...
my @date_today=Today();
my $today=substr(Date_to_Text(@date_today),4,11);
Switch($today)
{
case "14-Aug-2012" {Do A}
case "15-Aug-2012" {Do B}
case ...
case ...
case ...
}
最后3个案例陈述应该这样做:
between 16-Aug-2012 and 28-Sep-2012 {do C}
between 29-Sep-2012 and 26-Oct-2012 {do D}
between 27-Oct-2012 and 09-Nov-2012 {do E}
答案 0 :(得分:2)
使用软件工程方法。
如果您需要在整个天数范围内执行相同的操作,请使用该范围的ID作为谨慎值来选择。然后有一个子程序来告诉你日期所在的范围ID是什么:
sub range_for_date {
my $date = shift;
# Compute the range value in some discreet subset
# How to compute it is somewhat irrelevant
# and can be asked separately if you have no idea
# discreet subset can be an index 1..N, ecpoch timestamps,
# or a somehow-encoded range end date (e.g. "20121001" is easy)
# For the switch example below we will assume end dates
return $range_id; # in "20121001" format
}
switch (range_for_date($today)) {
case "20121001" { do B; }
case "20120110" { do A; }
}
答案 1 :(得分:0)
使用UNIX时间戳而不是日期字符串。时间戳是整数,可以很容易地分类为日期范围(并使用localtime()
重新格式化)。
例如,使用Time::Local
及其timelocal()
函数将字符串转换为时间戳:
use Time::Local;
my %months = ( # necessary because timelocal() expects month numbers, not strings
'Jan' => 0,
'Feb' => 1,
'Mar' => 2,
'Apr' => 3,
'May' => 4,
'Jun' => 5,
'Jul' => 6,
'Aug' => 7,
'Sep' => 8,
'Oct' => 9,
'Nov' => 10,
'Dec' => 11
);
my $today = '15-Aug-2012';
my @t = $today =~ /(\d{4})-(\w{3})-(\d{4})/;
$t[1] = $months{$t[1]}; # turn string into integer
my $timestamp = timelocal(0, 0, 0, @t[0, 1, 2]); # sec, min, hr, day, month, year
答案 2 :(得分:0)
这是另一种做法可能更简单一些。它只是将日期转换为YYYYMMDD格式,这样就可以对它们进行数字排序/比较。
sub sortable_date
{
my %months;
@months{
'Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'
} = ('01'..'12');
if (shift() =~ /^(\d{1,2})-(\w{3})-(\d{4})/ and exists $months{$2})
{
return "$3$months{$2}$1";
}
else { die "invalid date format!"; }
}
switch (sortable_date($today))
{
case sortable_date("14-Aug-2012") { do A }
case ($_[0] >= sortable_date("15-Aug-2012") and
$_[0] <= sortable_date("01-Oct-2012")) { do B }
}
我会推荐mpe的方法,但是如果你要在日常工作中做很多事情的话。