我想用最少的代码重新排列带有Perl正则表达式的时间戳。时间戳的原始格式如下:

2011/12/29 20:19:45

我需要做的就是将其转换,以便最前面的年份改为在月份/日期之后,如下所示:
12/29/2011 20:19:45

我可以通过下面的3行代码实现这一目标。我只是想知道是否有一种方法可以用更少的代码来做到这一点。特别是,我试图取消将$ 1存入中间变量的中间行,并直接从正则表达式中的第一个替换中指定$ 1进行第二个替换,但这会导致错误:“在连接中使用未初始化的值$ 1( )或字符串。”

如果不能删除第二行,那么似乎也不能降到一行吗?
#my $ts = '2011/12/29 20:19:45'; #input to a subroutine

$ts =~ s/^(\d{4})\///;
my $year = $1;
$ts =~ s/ /\/$year /;

最佳答案

您去这里:

$ts =~ s|^(\d{4})/(\d{2})/(\d{2})(.+)$|$2/$3/$1$4|;

请注意,上面的表达式期望时间戳分别在月份和日期中具有2位数字,而年份则具有4位数字。但是您可以使其更短但更可靠:
$ts =~ s|^(\d+)/(\d+)/(\d+)(.+)$|$2/$3/$1$4|;

这将正确处理1/12/98 12:34:56这样的时间戳。

09-12 11:33
查看更多