Возможно ли pu sh пару ключ-значение напрямую ha sh in perl? - PullRequest
2 голосов
/ 04 августа 2020

Я знаю, что push ing можно использовать только для массива, а не для sh. Но было бы намного удобнее разрешить прямую передачу пары ключ-значение в ha sh (и я все еще удивлен, что это невозможно в perl). У меня есть пример:

#!/usr/bin/perl -w

#superior words begin first, example of that word follow
my @ar = qw[Animals,dog Money,pound Jobs,doctor Food];
my %hash;
my $bool = 1;

sub marine{
    my $ar = shift if $bool;
    for(@$ar){
        my @ar2 = split /,/, $_;
        push %hash, ($ar2[0] => $ar2[1]);
    }
}

marine(\@ar);
print "$_\n" for keys %hash;

Здесь у меня есть массив, который имеет 2 слова отдельно через запятую ,. Я хотел бы сделать из него ha sh, сделав первый ключом, а второй значением (и если ему не хватает значения, как и последнее Food слово, тогда вообще никакого значения -> просто undef . Как сделать это в perl?

Вывод :

Possible attempt to separate words with commas at ./a line 4.
Experimental push on scalar is now forbidden at ./a line 12, near ");"
Execution of ./a aborted due to compilation errors.

Ответы [ 3 ]

8 голосов
/ 04 августа 2020
• 1000 выражение:
push %hash, ($ar2[0] => $ar2[1]);

С:

$hash{$ar2[0]} = $ar2[1];

Если я включу это в ваш код, а затем выгружу полученный ha sh в конце, я получу:

$VAR1 = {
          'Food' => undef,
          'Money' => 'pound',
          'Animals' => 'dog',
          'Jobs' => 'doctor'
        };
1 голос
/ 05 августа 2020

Разделить внутри map и назначить непосредственно для ha sh вот так:

my @ar = qw[Animals,dog Money,pound Jobs,doctor Food];
my %hash_new = map { 
                      my @a = split /,/, $_, 2; 
                      @a == 2 ? @a : (@a, undef) 
                   } @ar;

Обратите внимание, что это также может обрабатывать регистр с более чем одним разделителем-запятой (следовательно, разделение на макс. 2 элемента). Это также может обрабатывать регистр без запятых, например Food - в этом случае возвращается список с одним элементом плюс undef.

Если вам нужно push несколько ключей / пары значений с (другим) ha sh или объединить хэши, вы можете назначить список хэшей следующим образом:

%hash = (%hash_old, %hash_new);

Обратите внимание, что те же ключи в старом ha sh будет заменен новым ha sh.

0 голосов
/ 10 августа 2020

Мы можем назначить этот массив для ha sh, и perl автоматически будет смотреть на значения в массиве, как если бы они были парами ключ-значение. Нечетные элементы (первый, третий, пятый) станут ключами, а четные элементы (второй, четвертый, шестой) станут соответствующими значениями. проверить URL https://perlmaven.com/creating-hash-from-an-array

use strict;
use warnings;
use Data::Dumper qw(Dumper);

my @ar;
my %hash;

#The code in the enclosing block has warnings enabled, 
#but the inner block has disabled (misc and qw) related warnings.
{
    #You specified an odd number of elements to initialize a hash, which is odd, 
    #because hashes come in key/value pairs.
     no warnings 'misc';
     #If your code has use warnings turned on, as it should, then you'll get a warning about 
     #Possible attempt to separate words with commas
     no warnings 'qw';
     @ar = qw[Animals,dog Money,pound Jobs,doctor Food];
     # join the content of array with comma => Animals,dog,Money,pound,Jobs,doctor,Food
     # split the content using comma and assign to hash
     # split function returns the list in list context, or the size of the list in scalar context.
     %hash = split(",", (join(",", @ar)));
}

print Dumper(\%hash);

Вывод

$VAR1 = {
          'Animals' => 'dog',
          'Money' => 'pound',
          'Jobs' => 'doctor',
          'Food' => undef
        };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...