In trying to compress a list, I wrote the following code:

  my $compress = do {
      my $previous;
      $compress = -> $x {
          if !defined $previous or $x ne $previous {
              $previous = $x;
              $x;
          }
          else {
              ();
          }
      };
  }
  my @compressed = map $compress, <a a a a b c c a a d e e e e>;
  @compressed.say;

That's a bit more verbose than I intended, but that's partially because
of this:

  my $compress = do {
      my $previous;
      $compress = -> $x {
          if !defined $previous or $x ne $previous {
              $previous = $x;
              return $x;
          }
          else {
              return ();
          }
      };
  };

As soon as I put the return statements in an anonymous subroutine, I
get this error message:

  *** Cannot use this control structure outside a 'routine' structure
      at 99.pugs line 103, column 13-22

Take out the returns, and it works fine.  Can someone tell me what I'm
missing?  Is this a bug.

Also, I noticed I accidentally left off the final semi-colon on the do
block.  It ran anyway and that surprised me.

Cleaner ways of writing that code are welcome, too.

Cheers,
Ovid

--

Buy the book -- http://www.oreilly.com/catalog/perlhks/
Perl and CGI -- http://users.easystreet.com/ovid/cgi_course/

Reply via email to