Как создать хеш ключа - PullRequest
       2

Как создать хеш ключа

1 голос
/ 23 декабря 2011

У меня есть следующий код

use strict;
use warnings;
use Data::Dumper;

my $s = "12   A    P1  
23   B    P5
24   C    P2
15   D    P1
06   E    P5 ";
my $hash = {};
my @a  = split(/\n/, $s);

foreach (@a)
{
  my $c = (split)[2];
  my $d = (split)[1];
  my $e = (split)[0];
  push(@{$hash->{$c}}, $d);
}
print Dumper($hash );

Я получаю вывод

    $VAR1 = {
   'P5' => [
             'B',
             'E'
           ],
   'P2' => [
             'C'
           ],
   'P1' => [
             'A',
             'D'
           ]
    };

Но я хочу вывод как

 $VAR1 = {
'P5' => {
 'E' => '06',
 'B' => '23'
  },
 'P2' => {
   'C' => '24'
 },
 'P1' => {
   'A' => '12',
   'D' => '15'
 }
  };

Пожалуйста, помогите.

Ответы [ 2 ]

3 голосов
/ 23 декабря 2011

Вам нужно использовать хеш, если вы хотите, чтобы хеш-код выводился.

Нет необходимости разделять три раза и использовать постскрипты, просто разделите один раз и назначьте все переменные.Также не нужно инициализировать скаляр как пустой хеш, Perl позаботится об этом за вас.

Я переименовал переменные для повышения читабельности.

my $string = "12   A    P1  
23   B    P5
24   C    P2
15   D    P1
06   E    P5 ";
my $hash;
my @lines = split(/\n/, $string);

foreach (@lines)
{
    my ($value, $key2, $key) = split;
    $hash->{$key}{$key2} = $value;
}
print Dumper($hash );

Помните, что если у вас естьНесколько значений с одинаковыми ключами, они будут перезаписывать друг друга.В этом случае вам нужно вместо этого поместить значения в массив:

push @{$hash->{$key}{$key2}}, $value;
1 голос
/ 23 декабря 2011

Ну, это не так уж отличается от того, что у вас есть.Просто замените push хэш-назначением (спасибо, авививификация):

foreach (@a)
{
    my ($e, $d, $c) = split;
    $hash->{$c}->{$d} = $e;
}

Кроме того, я переставил «split» так, что он вызывается только один раз на строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...