我知道,可以像问题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>;
答案 0 :(得分:3)
您可以使用地图,但需要在内部移动拆分:
my %table = map { chomp; my @s = split /\t/; $s[1], \@s } <DATA>;