在Perl中,如何只拆分字符串的某个前导部分?

时间:2011-10-25 15:34:37

标签: perl split lazy-evaluation

我正在使用长行解析文件,其标记是以空格分隔的。在处理大部分行之前,我想检查第n个(小n)令牌是否有一些值。我会跳过大部分线路,所以真的没有必要拆分大部分非常长的线路。有没有快速的方法在Perl中进行惰性拆分,还是需要自己滚动?

2 个答案:

答案 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)

perldoc -f split

  

如果指定LIMIT且为正,则表示EXPR将被分割为的最大字段数,但返回的实际字段数取决于PATTERN在EXPR中匹配的次数。

my $nth = (split ' ', $line, $n + 1)[$n - 1];