in reply to Declare and slice-initialize hash in one statement?

You could use this

Update: Corrected typo (s/0/$_/)

sub zip { map{ $_[0][$_], $_[1][$_] } 0 .. $#{$_[0]} } my %hash = zip [ 1 .. 3 ], [ 'a' .. 'c' ]; my @a = 1 .. 3; my @b = 'a' .. 'c'; my %hash = zip \@a, \@b;

Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
Lingua non convalesco, consenesco et abolesco. -- Rule 1 has a caveat! -- Who broke the cabal?
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.

Replies are listed 'Best First'.
Re^2: Declare and slice-initialize hash in one statement?
by xdg (Monsignor) on Oct 27, 2005 at 16:51 UTC

    Which is also available in List::MoreUtils, with no referencing needed.

    use strict; use List::MoreUtils qw(zip); my @keys = (1..3); my @values = (4..6); my %hash = zip @keys, @values;

    -xdg

    Code written by xdg and posted on PerlMonks is public domain. It is provided as is with no warranties, express or implied, of any kind. Posted code may not have been tested. Use of posted code is at your own risk.

      Also called mesh()

      The downside of it's use of prototypes is that it precludes the use of inline anonymous array constructors:

      use List::MoreUtils qw[zip]; my %hash = zip [1..3],['a'..'c']; Type of arg 1 to main::zip must be array (not single ref constructor) +at Type of arg 2 to main::zip must be array (not single ref constructor) +at

      In this case, trading the avoidance of two backslashes for the need to declare and initilise temporary arrays, or substitute the unweildy

      use List::MoreUtils qw[zip]; my %hash = zip @{[1..3]},@{['a'..'c']};

      is not such a good trade. Of course it does handle more than two arrays, but that is a fairly rare usage.


      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      Lingua non convalesco, consenesco et abolesco. -- Rule 1 has a caveat! -- Who broke the cabal?
      "Science is about questioning the status quo. Questioning authority".
      In the absence of evidence, opinion is indistinguishable from prejudice.
        Defeat troublesome prototypes by calling functions with &. Order your ampersand today! (Some parentheses required.)
        my %hash = &zip([1..3],['a'..'c']);

        Caution: Contents may have been coded under pressure.
Re^2: Declare and slice-initialize hash in one statement?
by Juerd (Abbot) on Oct 27, 2005 at 18:56 UTC

    Perl 6 changes:

    • zip is built in!.
    • There is an infix operator for zipping too: ¥.
    • The ASCII equivalent, if you can't or won't type ¥, is: Y.
    • zip doesn't take references, but multiple lists. These are separated by semicolons (within parens!), or are specified with multiple <== pipes.
    • Lists can be initialized with a list of pairs, but fashioned key/value lists still work.
    Examples:
    my %hash = zip(@keys; @values); my %hash = zip(<== @keys <== @values); my %hash = @keys ¥ @values; my %hash = @keys Y @values;

    Juerd # { site => 'juerd.nl', plp_site => 'plp.juerd.nl', do_not_use => 'spamtrap' }