Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将逗号分隔的值转换为键值对Perl_Perl - Fatal编程技术网

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

将逗号分隔的值转换为键值对Perl,perl,Perl,我有一个格式为的状态数组 ('AL','Alabama','AK','Alaska','AR','Arkansas'...) 我想要的格式如下: [{'AL' => 'Alabama'},...] 这主要是为了使我可以更轻松地使用HTML::Template模块()循环 我对perl相当陌生,因此不确定如何执行此类操作,也找不到足够类似的操作。除非您需要保留此散列供以后使用,否则我认为简单地一次循环两个元素会更简单。您可以通过以下方式轻松完成此类循环: 或者,您可以使用相同的方法创建所

我有一个格式为的状态数组

('AL','Alabama','AK','Alaska','AR','Arkansas'...)
我想要的格式如下:

[{'AL' => 'Alabama'},...]
这主要是为了使我可以更轻松地使用HTML::Template模块()循环


我对perl相当陌生,因此不确定如何执行此类操作,也找不到足够类似的操作。

除非您需要保留此散列供以后使用,否则我认为简单地一次循环两个元素会更简单。您可以通过以下方式轻松完成此类循环:

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

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
注意:拼接将从
@状态中删除元素

可以轻松创建此格式:

use List::Util 1.29;
@state_hashes = List::Util::pairmap { +{ $a => $b } } @states;
use strict;
use warnings;
use List::UtilsBy 'bundle_by';
my @states = ('AL', 'Alabama', 'AK', 'Alaska', 'AR', 'Arkansas', ... );
my @hashes = bundle_by { +{@_} } 2, @states;

map
解决方案和一些高级的东西

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

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

以下内容对于HTML::Template是否更有意义

states => [ { id => 'AL', name => 'Alabama' }, ... ]
这将允许您使用以下模板:

<TMPL_LOOP NAME=states>
   <TMPL_VAR NAME=name> (<TMPL_VAR NAME=id>)
</TMPL_LOOP>
也就是说,您可能正在生成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 );

states => [ pairmap { +{ id => $a, name => $b } } @states ]
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 ]
使用列表::Util 1.29 qw(pairmap);
{
我的%转义=(
“&”=>“&;”,
'' => '',
'"' => '"',
"'" => ''',
);
子文本_to_html(u){${[0]=~s/([&“'])/$escapes{$1}/rg}
}
states=>[pairmap{+{id\u html=>$a,name\u html=>$b}将文本映射到\u html,@states]

使用List::Util 1.29 qw(pairmap);@state\u hashes=pairmap{+{$a=>$b}@states;
指定版本时仍然可以导入。@ikegami我不太喜欢导入公平,但其他人喜欢导入公平。(我喜欢导入,但我喜欢准确地列出导入的内容,而不是像你那样导入默认值)为什么在
使用列表::Util 1.29 qw(pairmap);
中使用版本?没有版本
使用列表::Util qw(pairmap);
在列表::Util 1.29之前使用失败的代码
“pairmap”“不是由List::Util模块导出的。1)错误消息更好,因为它说明了如何解决问题。2) 我实际上并没有把这个版本放在
use
语句中;我将它放在Makefile.PL/Build.PL中。这将向读者传达要放置在Makefile.PL/Build.PL中的版本。
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 ]