in reply to getting a regex to return an array of matches?

Did you try it out?

if(@match = $filepieces =~ /SOME_REGEX/smg) { # ... }

All dogma is stupid.

Replies are listed 'Best First'.
Re^2: getting a regex to return an array of matches?
by rmexico (Novice) on Feb 14, 2006 at 18:13 UTC
    i did try this, which doesn't work:
    #!/usr/bin/perl use strict; use warnings; use Data::Dumper; use diagnostics; undef $/; my $file = "test.txt"; open INFILE, "<$file" or die "cant open file: $!\n"; my @arr = <INFILE>; close INFILE; foreach my $filepieces (@arr) { my @matches = $1 if ($filepieces =~ /alpha\|(.*?)\|/smg); if(@matches) { foreach my $match (@matches) { print "match: $match\n"; } } }
    and the file:
    alpha|beta|alpha|theta|alpha|gamma|alpha|episilon
    that's just an example, splitting on the pipe isn't an option, b/c my real files to parse don't look like that

      This will:

      #!/usr/bin/perl use strict; use warnings; use Data::Dumper; use diagnostics; undef $/; my $text = <DATA>; my @matches; if (@matches = $text =~ /alpha\|([^|]+)\|/smg) { foreach my $match (@matches) { print "match: $match\n"; } } __DATA__ alpha|beta|alpha|theta|alpha|gamma|alpha|episilon

      Output:

      match: beta match: theta match: gamma

      Or you could dispense with loading data into the array at all (unless you need it for later):

      #!/usr/bin/perl use strict; use warnings; use Data::Dumper; use diagnostics; undef $/; my $text = <DATA>; while ($text =~ /alpha\|([^|]+)\|/smg) { print "match: $1\n"; } __DATA__ alpha|beta|alpha|theta|alpha|gamma|alpha|episilon

      All dogma is stupid.

      Never do
      my $var = ... if ...;,
      my $var = ... unless ...;,
      my $var = ... for ...;,
      my $var = ... foreach ...; or
      my $var = ... while ...;

      Split them into two statements, like
      my $var; $var = ... if ...;.

      Update: Well, this is bothering me. I can't remember why, and I can't find an example where the above fails.

      Update: diotalevi, which I believe has a knowledge of Perl guts, mentions: "my() has a runtime effect. You *always* (unless you're doing something freakish) want that to happen. The my $var STATEMENT-MODIFIER allows the runtime part of my() to potentially not happen." In other words, it sounds like doing any of the above leaves perl in an unstable state.

        not following here?
        my $var = $1 if ($filecontents =~ /SOME_REGEX(.*?)$/g); if($var) { ... proceed w/ usage of $var }
        why pre-declare, then use?