http://www.perlmonks.org?node_id=1222606


in reply to assigning arrays as values to keys of hash

Why do it in two passes when it can be done in one pass? Efficiency is over-rated. (tybalt89 ducks :)

#!/usr/bin/perl # https://perlmonks.org/?node_id=1222551 use strict; use warnings; use Data::Dumper; my %hash; while( <DATA> ) { /(\S+)\s+(\S+)/ and $hash{$1} = [ keys %{{map {$_, 1} @{$hash{$1}}, +$2}} ]; } print Dumper \%hash; __DATA__ snake fangs snake tail snake fangs bird feathers bird beak snake scales bird beak bird claw bird wings

Replies are listed 'Best First'.
Re^2: assigning arrays as values to keys of hash
by Marshall (Canon) on Sep 18, 2018 at 22:29 UTC
    Hi tybalt89!

    Great post!
    However, I am not convinced that your implementation would be more efficient than any of the "2 pass solutions".
    I thought my response to the OP at Re: assigning arrays as values to keys of hash to be reasonable and importantly: understandable by the OP.

    I think that sometimes PerlMonks fails new Perler's with overly complicated solutions that they can't understand or generalize.
    This OP is a beginner, not by user name, but by his original code.

    Your solution hides a foreach loop in terms of a map{} which does a lot of work. Shorter Perl code doesn't always mean "faster".

      It seems my "Efficiency is over-rated" comment was unclear. I fully believe (without testing, therefor as an article of faith) that my solution is slower than the two pass solutions. I guess I didn't make that clear. I am less interested in efficiency and more interested in solutions that show more rarely used perl capabilities.

      TIMTOWTDI forever :)

        Now that I understand what your objective was, all is fine.
        For a newbie, my objective is to show simple code that will "run like a rocket".
        The complications in your code are too much for a beginner.

        That sounds like a challenge :)

        #!/usr/bin/perl # https://perlmonks.org/?node_id=1222551 use strict; use warnings; use Data::Dumper; my %hash; $hash{ $& x /\S+/g }{ $& x //g } = 1 while <DATA>; $_ = [ keys %$_ ] for values %hash; print Dumper \%hash; __DATA__ snake fangs snake tail snake fangs bird feathers bird beak snake scales bird beak bird claw bird wings

        (I just wanted to post code that, if the problem is a homework assignment, will force the teacher to make the student go to the front of the class and explain on the blackboard, in detail, to the rest of the students, how the solution works :)

        What a hoot!