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␤

# number of lines starting with "b", with their line number
.say for lines-containing("foo\nbar\nbaz", *.starts-with("b"), :count-only);  # 2␤


Lines::Containing provides a single subroutine lines-containing that allows searching for a string in an object that can produce something akin to lines of text.



The lines-containing subroutine 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:

Only produce a count of lines that have a match.

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.

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).

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

Only makes sense if the needle is a Cool object. With words specified, will look for needle as a word in a line, with starts-with will look for the needle at the beginning of a line, with ends-with will look for the needle at the end of a line, with contains will look for the needle at any position in a line. Which is the default.

Produce lines only.


The has-word subroutine, as provided by the version of has-word that is used.


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.