我有一个数组,里面有一个数组。它看起来像:
@test =(
'mobilephone' => ['sony', 'htc'],
'pc' => ['dell', 'apple']
);
如何打印内部数组? 我有'手机',如果检查变量是=='手机',所以我想打印出sony和htc。怎么样?还是我有另一个错误?
答案 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} );