- 締切済み
配列の使い方について
二つ教えてください。 1.二次元配列で例えばファイルの一行目をグループ[1]に、二行目はグループ[2]に、三行目はグループ[1]に、四行目はグループ[3]に、みたいな感じでファイルの値を任意のグループ[n]に代入していきグループ分けする方法を教えてください。 2.上のような方法で作った配列を例えばグループ[2]にグループ[5]の要素をすべてつけたし、グループ[5]は削除する方法を教えてください。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
#1>次に書くようなプログラム 一応作ってみました。(抜けがあるかも・) 当初仕様通り配列の配列でやろうと思いましたが、リストに含まれているかどうかのチェックが面倒(一手間掛かる)のでハッシュの配列に変更しました。 ---------------------------------------------------------------- my @group=({'group0'=>'dummy'}); #グループ0のためのダミー my $i; while(<DATA>){ #実際には実際のファイルハンドルで置き換える my ($pair1, $pair2) = split; #スペース文字で区切られているペアを取り出す my $find=0; for($i=0;$i<@group;$i++){ if($group[$i]->{$pair1}){ #片方が現在のグループで見つかった $group[$i]->{$pair2}=$pair2; #もう片方をグループに追加 if($find){ #既に別グループに存在している my ($gp)=splice(@group, $i, 1); #このグループの切り取り foreach (keys %$gp){ $group[$find]->{$_}=$_; #グループ移動 } last; #ループの継続はできない } else { $find=$i; #グループ[$i] で見つかった } } elsif($group[$i]->{$pair2}){ #もう片方が現在のグループで見つかった $group[$i]->{$pair1}=$pair1; if($find){ #既に別グループに存在している my ($gp)=splice(@group, $i, 1); #このグループの切り取り foreach (keys %$gp){ $group[$find]->{$_}=$_; #グループ移動 } last; #ループの継続はできない } else { $find=$i; #グループ[$i] で見つかった } } } unless($find){ #両方みつからない、ペアで新しいグループを追加 push @group, { $pair1 => $pair1, $pair2 => $pair2 }; } } #結果グループの表示 for($i=1;$i<@group;$i++){ my @list = sort keys %{$group[$i]}; print "group[$i]=@list\n"; } #以下の部分はテストデータ __DATA__ a b a c b d e f g h h a
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
意味がもう一つよくわからないのですが、 1. @group=([],[],[],…); のような配列に仕分けるということでしょうか? 分けるのはそれぞれの配列に追加すればいいですが、任意のグループという場合には、仕分ける仕分け方(ルール)が決まらないことには回答ができないと思います。 2. 一般に配列に配列の要素を付け足すには、 @lista=(@lista,@listb); とか push @lista, @listb; とかすればいいです。 splice も使えます。 配列の削除は、 @lista=undef; によって削除できます。 @lista=(); は、効果としては(ほとんど)同じですが、ちょっと異なります。
お礼
回答ありがとうございます。 わかりにくい質問になってしまいすいません。 2についてはわかりました。 1については次に書くようなプログラムができればよいのでそれについて教えてくれませんか? ファイル a b a c b d e f g h h a があるとします。 まずaとbはグループ[1]に、cはaと同じグループ[1]に dはbがあるグループ[1]に、eとfはグループ[1]にないのでグループ[2]に、gとhはグループ[1]、[2]どちらにもないのでグループ[3]に、でも次の行でhはaと同じグループだとわかったのでhがあるグループ[3]はグループ[1]に入れるみたいな感じでファイルの中身を処理するプログラムを作ろうと思っています。 |グループ[1]=a b c d g h | |グループ[2]=e f | 大体でもよいので教えてもらえませんか?
お礼
いつも回答ありがとうございます。 これを参考にしながらやってみようと思います。