On Jan 23, [EMAIL PROTECTED] said:

>This newbie needs help with a regex.  Here's what the data from a text
>file looks like. There's no delimiter and the fields aren't evenly spaced
>apart.
>
>apples          San Antonio      Fruit
>oranges Sacramento             Fruit
>pineapples     Honolulu         Fruit
>lemons    Corona del Rey       Fruit
>
>Basically, I want to put the city names into an array.  The first field,
>the fruit name, is always one word with no spaces.
>
>Anyone know how to do that ?

Well, there are many ways.  You could split the string on whitespace,
remove the first and last elements, and join the others with spaces:

  for (@data) {
    my @fields = split;
    shift @fields;
    pop @fields;
    push @cities, "@fields";  # "@array" = join(" ", @array)
  }

Or, you could use a regex that gets SPECIFICALLY what you want:

  for (@data) {
    push @cities, $1 if /^\S+\s+(\S+(?:\s+\S+)*)\s+\S+$/;
  }

That regex might need a bit of explanation:

  m{
    ^                 # the beginning of the string
    \S+               # one or more non-spaces
    \s+               # one or more spaces
    (                 # capture to $1:
      \S+               # first word of the city name
      (?: \s+ \S+ )*    # *ALL* remaining words
    )
    \s+               # one or more spaces
    \S+               # one or more non-spaces
    $                 # the end of the string
  }x;

What this does on a string like "peach Georgia fruit" is this: the first
\S+\s+ matches "peach ".  Then we capture "Georgia fruit" to $1.  However,
the REST of the regex still has to match, but it can't, so the (?:\s+\S+)*
backtracks -- it gives up one of the chunks it matched, so $1 is only
"Georgia".  Then the last \s+\S+ can match " fruit".

-- 
Jeff "japhy" Pinyan      [EMAIL PROTECTED]      http://www.pobox.com/~japhy/
RPI Acacia brother #734   http://www.perlmonks.org/   http://www.cpan.org/
<stu> what does y/// stand for?  <tenderpuss> why, yansliterate of course.
[  I'm looking for programming work.  If you like my work, let me know.  ]


-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to