В Perl, как я могу разделить только определенную ведущую часть строки? - PullRequest
1 голос
/ 25 октября 2011

Я анализирую файл с длинными строками, чьи токены разделены пробелами.Прежде чем обрабатывать большую часть строки, я хочу проверить, имеет ли n-й (для маленьких n) токен какое-либо значение.Я пропущу большинство строк, так что на самом деле нет необходимости разбивать большинство очень длинных строк.Есть ли быстрый способ сделать ленивый сплит в Perl или мне нужно свернуть свой собственный?

Ответы [ 2 ]

9 голосов
/ 25 октября 2011

Вы можете указать предельный аргумент для оператора split, чтобы Perl прекратил расщепление после генерации определенного количества токенов.

@fields = split /\s+/, $expression, 4
Например,

поместит все после 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;
    ...
}

и иногда разделение выражения дважды может быть более эффективным, чем разделение полного выражения один раз.

5 голосов
/ 25 октября 2011

perldoc -f split :

Если указан LIMIT и положительный, он представляет максимальное количество полей, на которое будет разбит EXPR, хотя фактическое количество возвращаемых полей зависит от количества совпадений PATTERN в EXPR.

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