Perl, convert hash to array

后端 未结 11 2078
借酒劲吻你
借酒劲吻你 2021-02-05 06:56

If I have a hash in Perl that contains complete and sequential integer mappings (ie, all keys from from 0 to n are mapped to something, no keys outside of this), is there a mean

相关标签:
11条回答
  • 2021-02-05 07:21

    An easy way is to do @array = %hash

    For example,

    my %hash = (
        "0"  => "zero",
        "1" => "one",
        "2"  => "two",
        "3"  => "three",
        "4"  => "four",
        "5"  => "five",
        "6"  => "six",
        "7"  => "seven",
        "8"  => "eight",
        "9"  => "nine",
        "10"  => "ten",
    );
    
    my @array = %hash;
    

    print "@array"; would produce the following output,

    3 three 9 nine 5 five 8 eight 2 two 4 four 1 one 10 ten 7 seven 0 zero 6 six

    0 讨论(0)
  • 2021-02-05 07:23

    We can write a while as below:

    $j =0;
    while(($a1,$b1)=each(%hash1)){
        $arr[$j][0] = $a1;
        ($arr[$j][1],$arr[$j][2],$arr[$j][3],$arr[$j][4],$arr[$j][5],$arr[$j][6]) = values($b1);
        $j++;
    }
    

    $a1 contains the key and $b1 contains the values In the above example i have Hash of array and the array contains 6 elements.

    0 讨论(0)
  • 2021-02-05 07:24

    Combining FM's and Ether's answers allows one to avoid defining an otherwise unnecessary scalar:

    my @array = @hash{ 0 .. $#{[ keys %hash ]} };
    

    The neat thing is that unlike with the scalar approach, $# works above even in the unlikely event that the default index of the first element, $[, is non-zero.

    Of course, that would mean writing something silly and obfuscated like so:

    my @array = @hash{ $[ .. $#{[ keys %hash ]} };   # Not recommended
    

    But then there is always the remote chance that someone needs it somewhere (wince)...

    0 讨论(0)
  • 2021-02-05 07:25
    @a = @h{sort { $a <=> $b } keys %h};
    
    0 讨论(0)
  • 2021-02-05 07:28

    You can extract all the values from a hash with the values function:

    my @vals = values %hash;
    

    If you want them in a particular order, then you can put the keys in the desired order and then take a hash slice from that:

    my @sorted_vals = @hash{sort { $a <=> $b } keys %hash};
    
    0 讨论(0)
  • 2021-02-05 07:32

    If your original data source is a hash:

    # first find the max key value, if you don't already know it:
    use List::Util 'max';
    my $maxkey = max keys %hash;
    
    # get all the values, in order
    my @array = @hash{0 .. $maxkey};
    

    Or if your original data source is a hashref:

    my $maxkey = max keys %$hashref;
    my @array = @{$hashref}{0 .. $maxkey};
    

    This is easy to test using this example:

    my %hash;
    @hash{0 .. 9} = ('a' .. 'j');
    
    # insert code from above, and then print the result...
    use Data::Dumper;
    print Dumper(\%hash);
    print Dumper(\@array);
    
    $VAR1 = {
              '6' => 'g',
              '3' => 'd',
              '7' => 'h',
              '9' => 'j',
              '2' => 'c',
              '8' => 'i',
              '1' => 'b',
              '4' => 'e',
              '0' => 'a',
              '5' => 'f'
            };
    $VAR1 = [
              'a',
              'b',
              'c',
              'd',
              'e',
              'f',
              'g',
              'h',
              'i',
              'j'
            ];
    
    0 讨论(0)
提交回复
热议问题