访问perl中的内部数组?

时间:2011-12-28 15:37:03

标签: perl multidimensional-array

我有一个数组,里面有一个数组。它看起来像:

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

如何打印内部数组? 我有'手机',如果检查变量是=='手机',所以我想打印出sony和htc。怎么样?还是我有另一个错误?

5 个答案:

答案 0 :(得分: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 :(得分:3)

你可能想要一个哈希(由% sigil指定,它是一个关联数组的Perl名称(一个字符串作为键的集合))。如果是这样,其他4个答案中的一个将帮助您。如果您出于某种原因确实想要一个数组(如果您的数据可以有多个具有相同名称的键,或者您需要保留数据的顺序),则可以使用以下方法之一:

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

带有for循环:

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

答案 2 :(得分: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";
}

应该这样做。

答案 3 :(得分: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

答案 4 :(得分:0)

这看起来更像是哈希赋值而不是数组赋值。

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

在这种情况下,您可以尝试:

print Dumper( $test{mobilephone} );