Преобразовать значения через запятую в пару значений ключа Perl - PullRequest
0 голосов
/ 28 июня 2019

У меня есть массив состояний в формате

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

который я хочу отформатировать как:

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

Это прежде всего для того, чтобы мне было легче проходить через модуль HTML :: Template (https://metacpan.org/pod/HTML::Template#TMPL_LOOP)

)

Я довольно новичок в Perl, поэтому не знаю, как выполнить такое действие, и не могу найти что-то похожее.

Ответы [ 5 ]

3 голосов
/ 29 июня 2019

Разве следующее не имеет больше смысла для 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 ]
2 голосов
/ 28 июня 2019
use List::Util 1.29;
@state_hashes = List::Util::pairmap { +{ $a => $b } } @states;
1 голос
/ 28 июня 2019

bundle_by из 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;
1 голос
/ 28 июня 2019

Если вам не нужно хранить этот хеш для последующего использования, я думаю, что было бы проще зацикливать элементы по два за раз. Вы можете легко выполнить этот тип циклов с помощью 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

0 голосов
/ 28 июня 2019

map решение с несколькими мелкими вещами

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

my %states;
map { $states{$states[$_]} = $states[$_+1] unless $_%2 } 0..$#states;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...