in reply to Splitting array into two with a regex

my( @ok, @no ); push @{ $_->name =~ /\d{2}$/ ? \@ok : \@no }, $_ for @{ $rec->vals }

Update: Heh, I was going to mention Ruby as well.

Replies are listed 'Best First'.
Re^2: Splitting array into two with a regex
by Anonymous Monk on Nov 08, 2005 at 15:01 UTC

    Could you explain what does it mean @{$rec->vals}. Is it array ref? Could you give me an example of datastructure how it will look like. I am eager to learn the concept.

      $rec->vals we can presume is some OO code, but's it's not defined by the OP.

      What Fletch is doing here is testing the value returned by $rec->val, and according to the result, returning a reference to one of the two arrays. This whole things is wrapped in a @{ } which will deference the array ref returned in the first instance, which he can then push the value to.

      Here's a slightly less complicated version, using the same principal

      use strict; use Data::Dumper; my @numbers = (1,2,3,45,6,76,8,5,7,8); my(@odd, @even); foreach my $number (@numbers) { push @{ is_odd($number) ? \@odd : \@even}, $number; } print Dumper(\@odd, \@even); sub is_odd {$_[0] % 2}
      ---
      my name's not Keith, and I'm not reasonable.
      Could you explain what does it mean @{$rec->vals}.

      @{$rec->vals}
      can be written as
      @{$rec->vals()}
      or as
      my $aref = $rec->vals();
      @{$aref}

      Is it array ref?

      $rec->vals() is an expression that returns an array reference.
      @{$rec->vals()} is an expression that returns an array lvalue (which means it can be used like a real array).

      Update: Fixed problem noted by merlyn.

        @{$rec->vals()} is an expression that returns a list.
        Well, technically, it's an lvalue array expression, which when used as an rvalue in a list context, returns a list. When its used in a scalar context, it returns the length of the list. When it's used as an lvalue, it's an array.

        -- Randal L. Schwartz, Perl hacker
        Be sure to read my standard disclaimer if this is a reply.