Beefy Boxes and Bandwidth Generously Provided by pair Networks
XP is just a number
 
PerlMonks  

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

by doom (Deacon)
on Dec 05, 2007 at 23:52 UTC ( [id://655261]=note: print w/replies, xml ) Need Help??


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

The standard perl module List::Util has a "first" that does exactly what you want.

use List::Util qw( first ); open my $fh, '<', $your_file; my $line = first { m{ $your_pattern }x } <$fh>;

Replies are listed 'Best First'.
Re^2: Grepping with Perl: How to stop after first match?
by lodin (Hermit) on Dec 06, 2007 at 00:44 UTC

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

      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://655261]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others browsing the Monastery: (8)
As of 2024-04-19 07:24 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found