2011-12-28 18 views
0

私はそれに配列を持つ配列を持っています。次のようになります。perlの内部配列へのアクセス?

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

内部配列をどのようにプリントアウトできますか? 私は 'mobilephone'を持っています。チェック変数が== 'mobilephone'ならば、sonyとhtcを出力したいと思います。どうやって?それとも、私の間違いがもうありますか?

+1

おそらくハッシュがこれに適していますか? http://www.tizag.com/perlT/perlhashes.php – itdoesntwork

+0

tiztag Perlチュートリアルにリンクしないでください。それはむしろ古く厄介なコードです。代わりにhttp:// szabgabでhttp://learn.perl.orgまたはGaborの急成長チュートリアルを試してみてください。com/perl_tutorial.html。 –

答えて

4

@testが間違っています。あなたはハッシュを宣言しています。

スクリプトの冒頭には常にuse strict; use warnings;を使用してください。あなたは多くのエラーを検出することができます!

#!/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の名前()キーとして文字列を含むコレクションです%印章、で指定された)ハッシュをしたい:

$test{key}はあなたに対応する配列の参照を提供します。もしそうなら、他の4つの答えの一つがあなたを助けます。 (あなたのデータは、同じ名前を持つ複数のキーを持つことができる場合、またはあなたは、データの順序を保持する必要がある場合)あなたは、実際にいくつかの理由のために配列を望んでいた場合は、次のいずれかの方法を使用することができます。

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" 
    } 
} 

別の方法:

のforループと

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

各ブロックプリントmobilephone: sony htc

免責事項:私はList::Genを書いた方法で