Beefy Boxes and Bandwidth Generously Provided by pair Networks
Welcome to the Monastery
 
PerlMonks  

Re^2: Grepping with Perl: How to stop after first match?

by lodin (Hermit)
on Dec 06, 2007 at 00:44 UTC ( [id://655270]=note: print w/replies, xml ) Need Help??


in reply to Re: Grepping with Perl: How to stop after first match?
in thread Grepping with Perl: How to stop after first match?

"first" ... does exactly what you want

"Exactly" is a strong word. If he's trying to avoid reading through the whole file he won't achive that by using first. To some, first may seem to lazily evaluate its list arguments, but I'd like to emphasize that this is not the case. first will cause the whole file to be slurped into memory.

lodin

Update: changed "list" to "argument" to be more technically (?) correct.

Replies are listed 'Best First'.
Re^3: Grepping with Perl: How to stop after first match?
by dragonchild (Archbishop) on Dec 06, 2007 at 01:49 UTC
    Almost there. first itself is (almost) perfectly respectful of a lazy @_. In List::Util, the pure-perl version of first() is:
    sub first (&@) { my $code = shift; foreach (@_) { return $_ if &{$code}(); } undef; }
    The issue is (almost) completely that @_ is not lazy in the slightest. This is one of the biggest changes no-one will notice in Perl6 - the addition of the concept of truly lazy lists. You could code up something lazier with Tie::Array::Lazy. Maybe something like:
    open my $fh, '<', $filename or die "Cannot open '$filename' for readin +g: $!\n"; tie my @arr, 'Tie::Array::Lazy', [], sub { scalar <$fh> }; first { <whatever> } @arr;
    (Note that this is completely untested - I've never used Tie::Array::Lazy in my life.)

    My criteria for good software:
    1. Does it work?
    2. Can someone else come in, make a change, and be reasonably certain no bugs were introduced?

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://655270]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others pondering the Monastery: (4)
As of 2024-04-16 04:46 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found