如何将格式为YYYYMMDD的日期拆分为其组成部分?
my ($yyyy, $mm, $dd) = $date =~ /(\4d+)(\2d+)(\2d+)/;
my ($year, $month, $day) = unpack "A4A2A2", $date;
pack
和 unpack
是很强大但很少被使用的内置函数。
#!/usr/bin/perl -w
use strict;
sub main{
my $date = "some text with the numbers 2010063011 and more text";
print "Input Date: $date\n";
my ($year, $month, $day) = $date =~ /\b(\d{4})(\d{2})(\d{2})\b/;
print qq{
Date: $date
Year: $year
Month: $month
Day: $day\n} if (defined $year && defined $month && defined $day);
}
main();
请注意,这将查找正则表达式中的第一个日期,它不适用于2010063011
,因为它不是一个日期,但它适用于20100630
,这就是您想要的。
unpack
方法都很有道理,谢谢你在unpack
答案中添加了那个注释。 - user376314my ($year, $month, $day) = $date =~ /^(\d{4})(\d{2})(\d{2})\z/a
or die "bad date: $date";
$
而不是 \z
? - jdehaan$
的意思是字符串的结尾或 \n 并且后面没有其他字符。由于指定的格式不应该有 \n,所以我使用了 \z。 - ysth\d
匹配任何 Unicode 数字,而不仅仅是拉丁十进制数字。因此,如果您想进行输入验证,请使用 [0-9]
而不是 \d
。 - dolmen
$date
的存储方式,unpack
仅适用于固定宽度。根据我的例子,如果除了8个数字(甚至空格)之外还有其他文本,则unpack
将会出错。这就是为什么我的答案会添加一些预验证,使用\b
。 - vol7ron