Соедините ключи и значения в Perl - PullRequest
6 голосов
/ 07 декабря 2011

У меня есть хеш со следующей парой ключ / значение

4 => model1
2 => model2 

Я хочу создать следующую строку из вышеуказанного хеша

4 X model1 , 2 X model2

Я попробовал следующее

my %hash,
foreach my $keys (keys %hash) {
    my $string = $string . join(' X ',$keys,$hash{$keys});
}
print $string;

Что я получаю, это

4 X model12Xmodel2

Как мне достичь желаемого результата 4 X model1 , 2 X model2?

Ответы [ 2 ]

16 голосов
/ 07 декабря 2011

Вы можете сделать:

my %hash = (4 => "model1", 2 => "model2");
my $str = join(", ", map { "$_ X $hash{$_}" } keys %hash);
print $str;

Вывод:

4 X model1, 2 X model2

Как это работает:

map { expr } list оценивает expr для каждого элемента в list и возвращает список, содержащий все результаты этих оценок.Здесь "$_ X $hash{$_}" вычисляется для каждого ключа хэша, поэтому результатом является список key X value строк.join заботится о размещении запятых между каждой из этих строк.


Обратите внимание, что ваш хэш немного необычен, если вы храните пары (элемент, количество).Обычно все происходит наоборот:

my %hash = ("model1" => 4, "model2" => 2);
my $str = join(", ", map { "$hash{$_} X $_" } keys %hash);

, потому что в вашей схеме вы не можете хранить одинаковое количество для двух разных элементов в вашем хэше.

1 голос
/ 07 декабря 2011

Вы также можете изменить свой цикл следующим образом:

my @tokens =();
foreach my $key (keys %hash) {
     push @tokens, $string . join(' X ',$key, $hash{$key});
}
print join(', ' , @tokens);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...