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

pyt*_*hor 1 perl split lazy-evaluation

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

mob*_*mob 9

您可以为split运算符提供限制参数,以便在生成一定数量的标记后使Perl停止拆分.

@fields = split /\s+/, $expression, 4
Run Code Online (Sandbox Code Playgroud)

例如,将把第3个空格分隔字段后的所有内容放在第4个元素中@list.当表达式具有四个以上的字段时,这比完成拆分更有效.

如果您执行此延迟拆分并确定需要进一步处理该行,则需要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;
    ...
}
Run Code Online (Sandbox Code Playgroud)

并且偶尔将表达式拆分两次可能比总是将整个表达式拆分一次更有效.


Sin*_*nür 5

perldoc -f split:

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

my $nth = (split ' ', $line, $n + 1)[$n - 1];
Run Code Online (Sandbox Code Playgroud)