将逗号分隔的值转换为键值对Perl

时间:2019-06-28 14:34:30

标签: perl

我有一个状态数组

('AL','Alabama','AK','Alaska','AR','Arkansas'...)

我想要的格式如下:

[{'AL' => 'Alabama'},...]

主要是为了让我可以更轻松地使用HTML :: Template模块(https://metacpan.org/pod/HTML::Template#TMPL_LOOP

我对perl还是很陌生,所以不确定如何执行这种操作并且找不到足够类似的东西。

5 个答案:

答案 0 :(得分:3)

以下内容对HTML :: Template有意义吗?

states => [ { id => 'AL', name => 'Alabama' }, ... ]

这将允许您使用以下模板:

<TMPL_LOOP NAME=states>
   <TMPL_VAR NAME=name> (<TMPL_VAR NAME=id>)
</TMPL_LOOP>

要实现这一目标,您可以使用以下代码:

use List::Util 1.29 qw( pairmap );

states => [ pairmap { +{ id => $a, name => $b } } @states ]

也就是说,您可能正在生成HTML。

<select name="state">
   <TMPL_LOOP NAME=states>
      <option value="<TMPL_VAR NAME=id_html>"><TMPL_VAR NAME=name_html></option>
   </TMPL_LOOP>
</select>

要实现这一目标,您可以使用以下代码:

use List::Util 1.29 qw( pairmap );

{
   my %escapes = (
      '&' => '&amp;',
      '<' => '&lt;',
      '>' => '&gt;',
      '"' => '&quot;',
      "'" => '&#39;',
   );

   sub text_to_html(_) { $_[0] =~ s/([&<>"'])/$escapes{$1}/rg }
}

states => [ pairmap { +{ id_html => $a, name_html => $b } } map text_to_html, @states ]

答案 1 :(得分:2)

use List::Util 1.29;
@state_hashes = List::Util::pairmap { +{ $a => $b } } @states;

答案 2 :(得分:1)

除非您需要保留此哈希以供以后使用,否则我认为仅一次遍历两个元素就更简单了。您可以使用splice轻松完成这种循环:

my @states = ('AL','Alabama','AK','Alaska','AR','Arkansas'...);
while (my ($code, $name) = splice(@states, 0, 2)) {
   # operations here
}

或者,您可以使用相同的方法来创建所需的数据结构:

my @states = ('AL','Alabama','AK','Alaska','AR','Arkansas'...);
my @state_hashes = ();
while (my ($code, $name) = splice(@states, 0, 2)) {
   push @state_hashes, { $code => $name };
}
# do w/e you want with @state_hashes

注意:拼接将从@states中删除元素

答案 3 :(得分:1)

bundle_by from List::UtilsBy可以轻松创建以下格式:

use strict;
use warnings;
use List::UtilsBy 'bundle_by';
my @states = ('AL', 'Alabama', 'AK', 'Alaska', 'AR', 'Arkansas', ... );
my @hashes = bundle_by { +{@_} } 2, @states;

答案 4 :(得分:0)

map解决方案,包含一些完善的内容

my @states = ('AL','Alabama','AK','Alaska','AR','Arkansas','VT','Vermont');

my %states;
map { $states{$states[$_]} = $states[$_+1] unless $_%2 } 0..$#states;