我正在使用长行解析文件,其标记是以空格分隔的。在处理大部分行之前,我想检查第n个(小n)令牌是否有一些值。我会跳过大部分线路,所以真的没有必要拆分大部分非常长的线路。有没有快速的方法在Perl中进行惰性拆分,还是需要自己滚动?
答案 0 :(得分:9)
您可以为split
运算符提供限制参数,以便在生成一定数量的标记后使Perl停止拆分。
@fields = split /\s+/, $expression, 4
例如,将把第3个空格分隔字段后的所有内容放在@list
的第4个元素中。当表达式有四个以上的字段时,这比完成拆分更有效。
如果您执行此懒惰拆分并确定需要进一步处理该行,则需要再次split
该行。根据线的长度以及需要重新处理它们的频率,您仍然可以领先。
另一种方法可能是拆分您感兴趣的行的一部分。例如,如果该行包含许多字段但您想要在第4个字段上进行过滤,并且您确定第4个字段始终在第100个字段之前发生在线上的字节,说
@fields = split /\s+/, substr($expression, 0, 100);
if (matches_some_condition($line[3])) {
# process the whole line
@fields = split /\s+/, $expression;
...
}
偶尔将表达式拆分两次可能比总是将整个表达式拆分一次更有效。
答案 1 :(得分:5)
如果指定LIMIT且为正,则表示EXPR将被分割为的最大字段数,但返回的实际字段数取决于PATTERN在EXPR中匹配的次数。
my $nth = (split ' ', $line, $n + 1)[$n - 1];