如何在perl中分隔六位数并在每个部分之间有/?

时间:2015-08-18 01:10:35

标签: perl join split

我从包含日期的文件中抓取了一个字符串,但没有格式化。我想在月,日和年之间用/中格式化该日期。它目前返回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";
 }
}

3 个答案:

答案 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;
    }
}