in reply to adapting foreach to map

map is for returning a list (computed based on an input list); you aren't doing that so map is inappropriate. But you can use braces to pass a block to map so you could (mis)use it here. Did you try anything?

- tye        

Replies are listed 'Best First'.
Re^2: adapting foreach to map (why?)
by goibhniu (Hermit) on Aug 17, 2007 at 14:18 UTC

    I haven't tried anything on this one. It's a wierd kind of brain lock. I wrote this:

    %{$matchSolutionref} = map { $CTchars[$_] => (split(//,$word))[$_] } (0..$#CTchars);

    in this code and liked how it turned out. I keep trying to write something like:

    %p2C = map {if (not exists $p2C{$_}) {$k=chr(ord('A')+(($a++)+$caesar) +%26); $k => $_}} (split(//, $kp))

    but my fingers won't let me. Or maybe my fingers keep trying to write that and my brain won't let me.

    I guess I'm enamoured of the map BLOCK LIST syntax and am trying to get away with too much code in the BLOCK part.


    I humbly seek wisdom.
Re^2: adapting foreach to map (why?)
by goibhniu (Hermit) on Aug 18, 2007 at 09:06 UTC

    OK, I'm trying things. Here's what I've got.

    This first one is the nominal - it works and accomplishes what I want. I've decluttered from above so I'm only dealing with one hash and not using a temporary variable for the big, modular math. I've added a nice map statement to turn %p2C inside out, becoming %C2p.

    This produces output thus:

    C:\chas_sandbox>foreachasmap.pl CT: a b c d e f g h i j k l m n o p q r s t u v w x y z pt: F S Q I M X J L P Z R E A W U B N T C K O D V Y H G CT: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z pt: m p s v l a z y d g t h e q u i c k b r o w n f x j C:\chas_sandbox>

    Next, I've turned the if statement into a ( ? : ) operator. In version 1 I was looking for if (not exists . . .) so I needed something to do if it did exists and assigned to a hash key that I knew I wouldn't use, '#'. I've spotted my bug here - the autoincrement of $a happens every time now instead of only if (not exists . . .). Any suggestions for that or am I a victim of my own ambition?

    Here's the second output.

    C:\chas_sandbox>foreachasmap.pl CT: # a b c d e f g h i j k l m n o p q r s t u v w x y z pt: T N S Q Q M X S L P A R M C W U D N T E K O G V Z P O CT: A C D E G K L M N O P Q R S T U V W X Z pt: j m p s v t h l q z i c k b # o w n f x

    The last version here would be what I'm really after. I'm just moving things around according to the doc for map:

    %hash = map { getkey($_) => $_ } @array;
    is just a funny way to write
    %hash = (); foreach $_ (@array) { $hash{getkey($_)} = $_; }

    I have a foreach, a list and I'm mapping a key to a value in a hash, so it seems it should be no more complicated than this. Here's the code:

    I don't even get the same output as in version 2:

    C:\chas_sandbox>foreachasmap.pl CT: a b c d e f g h i j k l m n o p q r s t u v w x y z pt: U V W X Y Z A B C D E F G H I J K L M N O P Q R S T CT: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z pt: g h i j k l m n o p q r s t u v w x y z a b c d e f C:\chas_sandbox>

    I know this may all seem academic since it's working in version 1, but, well, it's academic and I'd like to learn something.


    I humbly seek wisdom.