Raku Land



Actions Status


Lines::Containing - look for lines containing a given needle


use Lines::Containing;

# lines with an "a"
.say for lines-containing("foo\nbar\nbaz", "a")  # bar␤baz␤

# lines ending on "r", with their line number
.say for lines-containing("foo\nbar\nbaz", / r $/, :kv);  # 1␤bar␤

# line numbers of lines starting with "f", starting at 1
.say for lines-containing("foo\nbar", *.starts-with("b"), :k, :offset(1));  # 2␤


Lines::Containing exports a single subroutine lines-containing that can either take a Seq or Iterator producing lines, an array with lines, a Hash (or Map) with lines as values, or any other object that supports a lines method producing lines (such as Str, IO::Path, IO::Handle, Supply) as the source to check.

As the second parameter, it takes either a Cool object, a regular expression, or a Callable as the needle to search for.

It returns a (potentially lazy) Seq of the lines that contained the needle.

If a Callable was specified as the second parameter, then the following rules apply:

Produce if True, or if :invert-match is specified, if False.

Always produce the original line.

Produce whatever was returned by the Callable otherwise.

Additionally, it supports the following named arguments:

Produce Pairs with the line number (or the key in case of a Hash) as the key.

Produce line numbers only, or keys only in case of a Hash.

Produce line number (or key in case of a Hash) and line alternately.

Produce lines only.

Ignore case (only if the needle is a Str).

Only produce lines that do NOT match.

Ignore mark (only if the needle is a Str).

Maximum number of matches that will be produced. Defaults to Any, which indicates that all matches must be produced.

The line number of the first line in the source (defaults to 0).


Elizabeth Mattijsen liz@raku.rocks

Source can be located at: https://github.com/lizmat/Lines-Containing . Comments and Pull Requests are welcome.

If you like this module, or what I’m doing more generally, committing to a small sponsorship would mean a great deal to me!


Copyright 2022 Elizabeth Mattijsen

This library is free software; you can redistribute it and/or modify it under the Artistic License 2.0.