使用perl分割空格

时间:2016-09-28 07:29:15

标签: regex perl

我有这行代码来分割文本文件中的空格:

my @line_splits = split /\s+/, $ine;

这是文本文件的几个内容:

  1 2016-09-27 14:07:20.084877
  2 2016-09-27 14:07:20.084998
  3 2016-09-27 14:07:20.131343
  4 2016-09-27 14:07:20.131374
  6 2016-09-27 14:07:20.137359
  7 2016-09-27 14:07:20.137556
  8 2016-09-27 14:07:20.137796
  9 2016-09-27 14:07:20.437769
 10 2016-09-27 14:07:20.437796
100 2016-09-27 14:07:23.293661 

我的目标是获取日期和时间(我知道的是$ line_splits [1]和$ line_splits [2])。

但是当我运行我的perl脚本时,从1到99的行是错误的,而在100和以上我已经得到了我想要的。

Time Stamp: 98 2016-09-27               --> line 98
Time Stamp: 99 2016-09-27               --> line 99
Time Stamp: 2016-09-27 14:07:23.293661  --> line 100
Time Stamp: 2016-09-27 14:07:23.299406  --> line 101
Time Stamp: 2016-09-27 14:07:23.299437  --> line 102

有人可以告诉我正则表达式有什么问题,还是有其他方法可以做到这一点?

我不知道这里是否已经重复,但我们非常感谢任何帮助。

谢谢:)

3 个答案:

答案 0 :(得分:8)

哇,很多复杂的答案,但解决方案真的很容易。

只需使用AsParallel而不使用split正则表达式。

default behaviour - 或者如果仅指定要分割/\s+/则获得的是它忽略了前导空格。但是' '它并没有。

/\s+/

答案 1 :(得分:1)

在按空格分割之前修剪每行左侧的空格:

$line =~ s/^\s+//;
my @line_splits = split /\s+/, $line;

像往常一样,@ Wiktor使用这个选项,它将保留前面小于100的数字空格:

my @line_splits = split /^\s+(*SKIP)(*F)|\s+/, $line;

在Perl 6中会有一个真正的trim函数:

$line .= trim;
my @line_splits = split /\s+/, $line;

答案 2 :(得分:1)

另一种选择是使用正则表达式来提取您感兴趣的字符串的位(即所有非空白位)。

#!/usr/bin/perl

use strict;
use warnings;
use 5.010;

while (<DATA>) {
  my @line_splits = /(\S+)/g;
  say "Time Stamp: $line_splits[1] $line_splits[2]";
}

__DATA__
  1 2016-09-27 14:07:20.084877
  2 2016-09-27 14:07:20.084998
  3 2016-09-27 14:07:20.131343
  4 2016-09-27 14:07:20.131374
  6 2016-09-27 14:07:20.137359
  7 2016-09-27 14:07:20.137556
  8 2016-09-27 14:07:20.137796
  9 2016-09-27 14:07:20.437769
 10 2016-09-27 14:07:20.437796
100 2016-09-27 14:07:23.293661