我从包含日期的文件中抓取了一个字符串,但没有格式化。我想在月,日和年之间用/中格式化该日期。它目前返回mmddyy,但我希望它格式化为mm / dd / yy以用于电子表格。任何帮助表示赞赏。这是我到目前为止所拥有的......
use strict;
use warnings;
my $file = 'd1528235.txt';
open my $fh, '<', $file or die "Could not open '$file' $!\n";
my $datestring;
my $date;
while (my $line = <$fh>) {
chomp $line;
if ( !$datestring and $line =~ m/=\((\d{6})/ ) {
$datestring = $1;
# print $datestring;
my $date;
my @date = split(/(\d\d)/, $datestring);
#foreach my $d (@date)
$date = join("/",@date);
# print "@date\n";
print "$date\n";
}
}
答案 0 :(得分:2)
最简单的方法是:
my $s = '151211';
say join('/', $s =~ /([0-9]{2})/g);
答案 1 :(得分:1)
您可以使用捕获组单独捕获月份日和年份,而不是捕获$ datestring:
while (my $line = <$fh>) {
my ( $month, $day, $year ) = $line =~ /(\d{2})(\d{2})(\d{2})/;
print "$month/$day/$year\n";
}
答案 2 :(得分:1)
此解决方案使用以下事实:不匹配的正则表达式模式将在列表上下文中返回空列表。在空列表上使用join
将返回空字符串,这是 false 值
因此,如果当前行中出现$date = join '/', /=\((\d\d)(\d\d)(\d\d)/
之类的序列,则$date
语句会将12/34/56
设置为空字符串或=(123456
之类的日期
使用$_
来保存当前行通常更容易,因为它是许多内置函数的默认参数,并且通常可以使代码更清晰更简洁
很难知道该写什么作为一个例子,因为你没有说明你想对你的文件数据做什么。我希望这段代码足够清晰,可以推断出你自己的解决方案;它只是在读取第一个匹配行时打印重新格式化的日期
use strict;
use warnings;
use v5.14;
use autodie;
use re '/a';
my $file = 'd1528235.txt';
open my $fh, '<', $file;
my $date;
while ( <$fh> ) {
chomp;
if ( not $date and $date = join '/', /=\((\d\d)(\d\d)(\d\d)/ ) {
say $date;
}
}