Как я могу пропустить первые несколько строк текстового файла с помощью конструкции raku IO.lines.race - PullRequest
6 голосов
/ 04 марта 2020

Я пытаюсь прочитать текстовый файл, используя raku с конструкцией IO.lines.race. Например,

for $file.IO.lines.race
{
  #do something, such as
  my ($a,$b)=.split(" ");
}

Как я могу пропустить, скажем, первые три строки текстового файла?

Спасибо!

Тао

Ответы [ 2 ]

10 голосов
/ 04 марта 2020

Обновление: в соответствии с рекомендацией Элизабет Маттийсен, более эффективно использовать пропуск вместо хвоста.

for $file.IO.lines.skip(3).race

Существует подпрограмма tail , которую можно использовать:

for $file.IO.lines.tail(*-3).race
{
  #do something, such as
  my ($a,$b)=.split(" ");
}
5 голосов
/ 04 марта 2020

Ответ Лукаса Валле выше совершенно в порядке; Вы можете использовать skip , чтобы пропустить ненужные вам строки. Тем не менее, я не могу не указать, что case лучше работает с другими функциональными конструкциями, такими как map:

$file.IO.lines.skip(3).race.map( .split(" ") );

Таким образом, вы можете объединить несколько операций в цепочку, не создавая различных циклов. Конечно, в Raku TIMTOWDI, так что for l oop (или несколько) совершенно нормально.

Кроме того, в этом случае я бы действительно рассчитывал, сколько l oop, или map, собирается взять. Для файлов, которые не имеют много строк, race не даст вам много, и это может быть даже медленнее из-за накладных расходов. Если вы намерены немного побить время, IO::Handle.Supply, вероятно, будет немного быстрее.

...