On Fri, 09 Jun 2017 03:42:36 -0700, tbrowder wrote:
> Add a line number method to IO::Handle so that it can be used on demand:
> 
> my $fh = open "some-text", :linenumber, :index1;
> 
> for $fh.lines -> $line {
>     say "$fh.ln";   # output: 1
>     last;
> }

Thank you for the suggestion, however, we're not going to add that feature in 
core.

You can already get line numbering, by typing even fewer characters than what 
your example demonstrates:

    for 1..* Z "some-text".IO.lines -> ($ln, $line) {
        say $ln; # output: 1
    }

As you can see. It works without even involving the filehandle at all.

The problem with adding the method you suggest is it'll give wrong information 
more often than not.

    for $fh.lines »=>» 'a'..'z' {
        say $fh.ln
    }

Above, the method will always return the number of the last line, because the 
hyper is evaluated eagerly.

    for $fh.lines -> $line {
        say $fh.ln;
        say $fh.readchars: 2000;
    }

Above, line numbering will get out of a whack, the second .readchars reads in 
the $.nl-in chars. The solution to that would be to make all read 
operations—even binary—scan their data for $.nl-in strings, which would make 
our slow IO even slower. And it's even more problematic in binary read methods 
since we might not be reading a chunk of valid $.encoding text.

    for "file.txt".IO.lines -> $line {
        say $fh.ln;
    }

And the above won't work at all, since the file handle isn't available.

The aforementioned `1..* Z` method feels a fine solution to me, but if you 
really want the `.ln`
method, create a module that mixes it in. IO::CatHandle::AutoLines does what 
you want for cat 
handles, so you should be able to re-use a lot of its guts.

[1] https://modules.perl6.org/dist/IO::CatHandle::AutoLines

Reply via email to