我有这行代码来分割文本文件中的空格:
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
有人可以告诉我正则表达式有什么问题,还是有其他方法可以做到这一点?
我不知道这里是否已经重复,但我们非常感谢任何帮助。
谢谢:)
答案 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