在Perl中,如果将变量$ period_end_date设置为,例如,' 4/30/2014',如何将$ period_start_date设置为' 4/1/2014'和$ next_period_start_date到' 5/1/2014'? (即分别设定为月份的第一个月和下个月的第一个月。
我尝试过使用DateTime模块但我的系统找不到它。我正在考虑使用substr来提取碎片,但月和日可以有1或2位数。
我如何更改/' s之间的内容?
答案 0 :(得分:1)
如果您知道输入数据将始终采用mm/dd/yyyy
格式,并且您真的只担心mm
和dd
可以有一个或两个数字,然后你可以使用正则表达式匹配:
$period_end_date =~ m{(\d+)/(\d+)/(\d+)};
my $month = $1;
my $day = $2;
my $year = $3;
我使用m{}
格式进行模式匹配而不是//
,以避免必须在日期内转义/
个字符。你可以写
而是模式/(\d+)\/(\d+)\/(\d+)/
。
答案 1 :(得分:1)
这应该对你有帮助。
此解决方案不是使用更复杂的正则表达式,而是从字符串中提取所有数字字段。
计算只是递增月份,如果月份已经变为1,也会增加年份。
use strict;
use warnings;
my $period_end_date = '4/30/2014';
my @mdy = $period_end_date =~ /\d+/g;
$mdy[1] = 1;
my $period_start_date = sprintf '%02d/%02d/%04d', @mdy;
$mdy[0] = $mdy[0] % 12 + 1;
++$mdy[2] if $mdy[0] == 1;
my $next_period_start_date = sprintf '%02d/%02d/%04d', @mdy;
print "$_\n" for $period_end_date, $period_start_date, $next_period_start_date;
<强>输出强>
4/30/2014
04/01/2014
05/01/2014