2016-02-09 2 views
1

Как изменить элемент/s в двумерном массиве в perl?Perl: изменить элемент/s в двумерном массиве

Предположим, что у меня есть следующий массив и хотите изменить цену товара:

my @clothes = (
    { item => 'Jeans', colour => 'Blue', price => 50 }, 
    { item => 'Shawl', colour => 'Red', price => 30 }, 
    { item => 'Blazer', colour => 'Brown', price => 100 }, 
    { item => 'Suit', colour => 'Black', price => 40 }, 
    { item => 'Top', colour => 'White', price => 25 } 
); 

ответ

4

Вы не двумерный массив --- у вас есть массив hashrefs. Если вы хотите изменить цену определенного элемента, вам нужно знать индекс массива, который содержит хеш-ссылку, к которой он принадлежит.

$clothes[1]->{price} = 42; 

Для дополнительных вещей, которые вы можете сделать с помощью массива хэшей см метко назвал Arrays of Hashes раздел perldsc.

+0

Точно, что я искал –

7

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

$clothes[3] 

является ссылкой на хэш, так что

$clothes[3]->{price} 

это значение price элемента этого хэш. -> может быть опущена между индексами, так что следующее эквивалентно:

$clothes[3]{price} 

Это означает, что вы хотите

$clothes[3]{price} = 45; 

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

for my $clothes_item (@clothes) { 
    if ($clothes_item->{item} eq 'Suit') { 
     $clothes_item->{price} = 45; 
    } 
} 
0
#!/usr/bin/perl 

use strict; 
use warnings; 
use Data::Dumper; 

my @clothes = 
    (
     {item => 'Jeans', colour => 'Blue', price => 50}, 
     {item => 'Shawl', colour => 'Red', price => 30}, 
     {item => 'Blazer', colour => 'Brown', price => 100}, 
     {item => 'Suit', colour => 'Black', price => 40}, 
     {item => 'Top', colour => 'White', price => 25}  
    ); 

for my $next_item (@clothes){ 
     $next_item->{price} = 0.99 
} 

print Dumper(\@clothes); 
+1

Ваш код изменяет цену на _every_ item ... –

+4

@MattJacob Все предметы 99 центов, все должно идти! – ThisSuitIsBlackNot

+0

@ThisSuitIsBlackNot Hahaha –

Смежные вопросы