> Mailing-List: contact [EMAIL PROTECTED]; run by ezmlm
> Date: Tue, 10 Dec 2002 21:07:34 -0500
> From: Adam Turoff <[EMAIL PROTECTED]>
> Cc: [EMAIL PROTECTED]
> Content-Disposition: inline
> X-SMTPD: qpsmtpd/0.20, http://develooper.com/code/qpsmtpd/
> 
> On Tue, Dec 10, 2002 at 03:38:58PM -0800, Rich Morin wrote:
> > On occasion, I have found it useful to cobble up a "little language"
> > that allows me to generate a list of items, using a wild-card or some
> > other syntax, as:
> > 
> >   foo[0-9][0-9]  yields foo00, foo01, ...
> > 
> > I'm wondering whether Perl should have a similar capability, using REs.
> 
> Dominus has an example of an 'odometer' written using closures.  If
> you want to specify a simple sequence like this using a regex, then
> you need to parse the regex (but in reverse).
> 
> Alternatively, you could write a generic odometer generator generator
> that takes a series of scalars and lists:
> 
>       my $generator = make_generator('foo', [0..9], [0..9]);
> 
>       while ($_ = $generator->()) {
>               ## progressively generate foo00, foo01, ...
>       }
> 
> Z.

It only differentiates between arrays an non-, but it would be trivial
to add other semantics, if you figure out what they actually are.

  sub make_generator(*@pats) {
      return unless @pats;
      
      given shift @pats -> $pattern { 
          when Array {
              for @$pattern -> $item {
                  my $generator = make_generator(@pats);
                  yield $item ~ $_ for <$generator>;
              }
          }
          otherwise {
              my $generator = make_generator(@pats);
              yield $pattern ~ $_ for <$generator>;
          }
      }        
  }

You'd use it just like I did in the sub, as an iterator.

This would have been dastardly complex without corouties. :-)

Luke

Reply via email to