Копирование элементов массива хэшей - PullRequest
3 голосов
/ 02 января 2012

Мой массив хэшей:

@cur = [
          {
            'A' => '9872',
            'B' => '1111'
          },
          {
            'A' => '9871',
            'B' => '1111'
          }
        ];

Ожидаемый результат:

@curnew = ('9872', '9871');

Любой простой способ получить только значения первого элемента хеша из
this и назначить егов массив?

Ответы [ 3 ]

8 голосов
/ 02 января 2012

Заметьте, что хэши не упорядочены, поэтому я беру слово first для обозначения сначала лексикографически .

map {                               # iterate over the list of hashrefs
    $_->{                           # access the value of the hashref
        (sort keys $_)[0]           # … whose key is the first one when sorted
    }
}
@{                                  # deref the arrayref into a list of hashrefs
    $cur[0]                         # first/only arrayref (???)
}

Выражение возвращает qw(9872 9871).

Назначение arrayref для массива, как в @cur = […], вероятно, является ошибкой, но я принял это за чистую монету.


Bonus perl5i решение:

use perl5i::2;
$cur[0]->map(sub {
    $_->{ $_->keys->sort->at(0) } 
})->flatten;

Выражение возвращает те же значения, что и выше.Этот код немного длиннее, но IMO более читабелен, потому что поток выполнения идет строго сверху вниз, слева направо.

3 голосов
/ 02 января 2012

Сначала ваш массив должен быть определен как

my @cur = (
    {
        'A' => '9872',
        'B' => '1111'
    },
    {
        'A' => '9871',
        'B' => '1111'
    }
);

Обратите внимание на круглые скобки

#!/usr/bin/perl 
use strict;
use warnings;
use Data::Dump qw(dump);

my @cur = (
    {
        'A' => '9872',
        'B' => '1111'
    },
    {
        'A' => '9871',
        'B' => '1111'
    }
);
my @new;
foreach(@cur){
    push @new, $_->{A};
}
dump @new;
1 голос
/ 02 января 2012
use Data::Dumper;
my @hashes = map (@{$_}, map ($_, $cur[0]));
my @result = map ($_->{'A'} , @hashes);    
print Dumper \@result;
...