in reply to map a list

I don't think this is the best way to solve the problem but, instead of ternaries, I thought I'd have a go with regex conditionals. It also uses an on-the-fly subroutine method suggested by almut a couple of months ago here.

use strict; use warnings; my $str = q{a,b=c,e=#f,ghi}; my @result = map { my $res; m {(?x) ^ (?(?=([a-z])$) (?{(sub {($res) = @_})->(qq{$1=>fn($1)})}) | (?(?=([a-z])=([a-z])$) (?{(sub {($res) = @_})->(qq{$2=>$3})}) | (?(?=([a-z])=\#([a-z])$) (?{(sub {($res) = @_})->(qq{$4=>fn($5)})}) | (?{(sub {($res) = @_})->(q{???})}) ) ) ) }; $res } split m{,}, $str; print qq{@result\n};

It prints

a=>fn(a) b=>c e=>fn(f) ???

I hope this is of interest.

Cheers,

JohnGG

Replies are listed 'Best First'.
Re^2: map a list
by ikegami (Patriarch) on Mar 12, 2007 at 23:30 UTC
    You can simplify your code a lot by making $res a package variable.
    my @result = map { local our $res; m {(?x) ^ (?(?=([a-z])$) (?{ $res = qq{$1=>fn($1)}; }) | (?(?=([a-z])=([a-z])$) (?{ $res = qq{$2=>$3}; }) | (?(?=([a-z])=\#([a-z])$) (?{ $res = qq{$4=>fn($5)}; }) | (?{ $res = q{???}; }) ) ) ) }; $res } split m{,}, $str;

    Of course, the above is just an obfuscated way of doing

    my @result = map { (/([a-z])$/ ? qq{$1=>fn($2)} : (/([a-z])=([a-z])$/ ? qq{$1=>$2} : (/([a-z])=\#([a-z])$/ ? qq{$1=>fn($2)} : q{???} ) ) ) } split m{,}, $str;

    By no means do I consider the second snippet acceptable either.

    By the way, why did you introduce limits on what the values can be? Nowhere did the OP imply the values would be single lowercase letters. If you remove that arbitrary limit, you can get rid of the "???" case.

    Why did you also changed the output, returning a string where a pair of values should have been returned?