将多元素字符串拆分为哈希

时间:2018-09-18 12:50:21

标签: perl

我知道,可以像问题How to do I split a string into hash keys with undef values?Perl Monks thread一样使用map轻松地将字符串拆分为哈希。因此,类似这样的事情很容易起作用:

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",
}

但是,如果有一个更复杂的数据表,并且想使用第二列作为键来对数组进行散列,那么使用map可以做到这一点,还是必须使用“较长”形式: / p>

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 :(得分:3)

您可以使用地图,但需要在内部移动拆分:

my %table = map { chomp; my @s = split /\t/; $s[1], \@s } <DATA>;