Разбить многоэлементную строку на хеш - PullRequest
0 голосов
/ 18 сентября 2018

Я знаю, что можно легко разбить строку на хеш, используя map, как этот вопрос Как мне разбить строку на ключи хеша со значениями undef? , или это Perl Monksнить .Итак, что-то вроде этого очень легко работает:

my %table = map { chomp; split(/\t/) } <DATA>;
dd \%table;

__DATA__
#1245   banana
#3499   cherry
#5290   notebook
#2112   compact_disc

Конечно, это приведет к:

{
  "#1245" => "banana",
  "#2112" => "compact_disc",
  "#3499" => "cherry",
  "#5290" => "notebook",
}

Если бы у кого-то была более сложная таблица данных, и он хотел бысделать хэш массивов, используя второй столбец в качестве ключа, это возможно с картой, или нужно использовать «более длинную» форму:

my %table;
while(<DATA>) {
    chomp(my @elems = split(/\t/));
    $table{$elems[1]} = \@elems;
}
dd \%table;

__DATA__
shelf1  #1245   banana  Dole
shelf1  #3499   cherry  Acme
shelf2  #5290   notebook    Staples
shelf3  #2112   compact_disc    Mercury_Records

, чтобы сделать:

{
  "#1245" => ["shelf1", "#1245", "banana", "Dole"],
  "#2112" => ["shelf3", "#2112", "compact_disc", "Mercury_Records"],
  "#3499" => ["shelf1", "#3499", "cherry", "Acme"],
  "#5290" => ["shelf2", "#5290", "notebook", "Staples"],
}

Я попробовал эти два подхода, но ни один из них, похоже, не работает, и я предполагаю, что это невозможно.Но просто из любопытства (и образования) было интересно, можно ли сделать это подобным образом.

my %table = map{ $_->[1] => @$_ } split(/\t/, <DATA>);
my %table = map{ split(/\t/); $_->[1], @$_ } <DATA>;

1 Ответ

0 голосов
/ 18 сентября 2018

Вы можете использовать карту, но вам нужно переместить разделение внутри:

my %table = map { chomp; my @s = split /\t/; $s[1], \@s } <DATA>;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...