プロが教える店舗&オフィスのセキュリティ対策術

配列の配列について教えてください。

以下のようなテキストから値を取得し、A,B,Cの値をそれぞれ別の配列に格納し、A,B,Cの平均値を出す処理を行っているとします。

-----
A=100
B=200
C=300
A=110
B=210
:
-----

現状、以下のような状態です。

@arrayA=();
@arrayB=();
@arrayC=();

(テキストを読み込み)

・読み込んだ行がA=XXXならarrayAにpush
push(@arrayA,"100");
・読み込んだっ行がB=XXXならarrayBにpush
push(@arrayB,"100");

(各配列の要素の平均値を出す)

このやり方だと、グループが増えるとそのまま行数が増えて冗長なので、グループごとの配列を1つの配列にまとめたいのです。

Webで初期値を入れた形で説明しているのはよくみるのですが、今回のように空の配列に値をいれていくにはどうすればよいのでしょうか?(そもそも宣言の仕方もわかりません)。

また、配列の配列?とした場合、以下のような処理はできるのでしょうか?

(1)配列の1つ目の要素(の配列)にpushする(現状でのarrayAにpushに該当)
push(@arrayAll[0],"test");

A 回答 (2件)

>このやり方だと、グループが増えるとそのまま行数が増えて冗長なので、グループごとの配列を1つの配列にまとめたいのです。



これは配列の配列を使うのではなく,
無名配列を値にもつ
連想配列と楽かな.

>また、配列の配列?とした場合、以下のような処理はできるのでしょうか?
できません.
Perlでの多次元配列の扱いを調べましょう.
#端的にいってしまえば,一次元配列で各要素が無名配列か
#配列へのリファレンスになってればそれは多次元配列・・

サンプルコード:

use strict;
use warnings;

my %all;

sub ave{
my $array=shift;
my $ave=0 ;
foreach my $i (@$array){
$ave = $ave + $i;
}
return $ave/(scalar @$array);
}

while(<DATA>){
chomp;
my ($key, $val)=split(/=/,$_);
if (defined $all{$key}){
push(@{$all{$key}}, $val);
}else{
$all{$key}=[$val];
}
}

print "Average of A is ", ave($all{"A"}), ".\n";
print "Average of B is ", ave($all{"B"}), ".\n";
print "Average of C is ", ave($all{"C"}), ".\n";

__DATA__
A=100
B=200
C=300
A=110
B=210
    • good
    • 0

(無名) 配列を要素に持つハッシュを使う.



my %values = ();
while (my $line = <>) {
chomp($line);
my ($group, $val) = ($line =~ /^(\w)=(\d)/);
push @{$values{$group}}, $val;
}

みたいな感じ.

「空の配列」は配列なので, 末尾にデータを追加したければ push すればいい.
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!