2011-12-28 5 views
0

У меня есть массив с массивом в нем. Это выглядит так:Доступ к внутреннему массиву в perl?

@test =(
    'mobilephone' => ['sony', 'htc'], 
    'pc' => ['dell', 'apple'] 
); 

Как распечатать внутренний массив? У меня есть «мобильный телефон», и если контрольная переменная является «мобильным телефоном», я хочу распечатать sony и htc. Как? Или есть еще одна ошибка?

+1

Может быть, хэш лучше для этого? http://www.tizag.com/perlT/perlhashes.php – itdoesntwork

+0

Пожалуйста, не связывайтесь с учебником Perl tiztag. Это довольно старый и неприятный код. Вместо этого попробуйте http://learn.perl.org или быстро развивающийся учебник Gabor по адресу http: // szabgab.ком/perl_tutorial.html. –

ответ

4

@test неправильно , Вы объявляете хэш.

Всегда используйте use strict; use warnings; в начале вашего скрипта. Вы сможете обнаружить множество ошибок!

$test{key} даст вам соответствующую ссылку на массив:

#!/usr/bin/perl 

use strict; 
use warnings; 

my %test =(
    mobilephone => ['sony', 'htc'], 
    pc => ['dell', 'apple'] 
); 

my $array = $test{mobilephone}; 

for my $brand (@{$array}) { 
    print "$brand\n"; 
} 

# or 

for my $brand (@{ $test{mobilephone} }) { 
    print "$brand\n"; 
} 
+1

'warnings' не поймает эту ошибку. OP сделал вполне допустимое назначение массиву. – mob

+1

@mob Я знаю, но у него было бы предупреждение, пытаясь использовать его как хэш. Он просто опубликовал определение, а не попытки его использовать. – Matteo

1

Обратите внимание, я изменил свой тест на хэш

my %test =(
    'mobilephone' => ['sony', 'htc'], 
    'pc' => ['dell', 'apple'] 
); 

#Get the array reference corresponding to a hash key 
my $pcarray = $test{mobilephone}; 

#loop through all array elements 
foreach my $k (@$pcarray) 
{ 
    print $k , "\n"; 
} 

должны это сделать.

0

Это больше похоже на назначение хеширования, чем назначение массива.

%test =(
    'mobilephone' => ['sony', 'htc'], 
    'pc' => ['dell', 'apple'] 
); 

В этом случае, вы бы попробовать:

print Dumper($test{mobilephone}); 
1

Это не массив, это хеш:

%test =(
    'mobilephone' => ['sony', 'htc'], 
    'pc' => ['dell', 'apple'] 
); 

my $inner = $test{'mobilephone'}; # get reference to array 
print @$inner;     # print dereferenced array ref 

Или

print @{$test{'mobilephone'}}; # dereference array ref and print right away 
3

Вы, вероятно, хотите хэш (обозначенный в % сигилах, что имя Perl для ассоциативного массива (коллекция со строками в качестве ключей)). Если это так, вам поможет один из четырех ответов. Если вы на самом деле хотели массив для какой-то причины (если ваши данные могут иметь несколько ключей с тем же именем, или если вам нужно сохранить порядок данных), вы можете использовать один из следующих способов:

my @test = (
    mobilephone => [qw(sony htc)], 
    pc'   => [qw(dell apple)] 
); 

с для цикла:

for (0 .. $#test/2) { 
    if ($test[$_*2] eq 'mobilephone') { 
     print "$test[$_*2]: @{$test[$_*2+1]}\n" 
    } 
} 

с использованием модуля:

use List::Gen 'every'; 
for (every 2 => @test) { 
    if ($$_[0] eq 'mobilephone') { 
     print "$$_[0]: @{$$_[1]}\n" 
    } 
} 

другой способ:

use List::Gen 'mapn'; 
mapn { 
    print "$_: @{$_[1]}\n" if $_ eq 'mobilephone' 
} 2 => @test; 

методами:

use List::Gen 'by'; 
(by 2 => @test) 
    ->grep(sub {$$_[0] eq 'mobilephone'}) 
    ->map(sub {"$$_[0]: @{$$_[1]}"}) 
    ->say; 

Каждый блок печатает mobilephone: sony htc

Отказ от ответственности: я написал List::Gen.

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