回答編集履歴

1

説明追記

2018/08/16 11:41

投稿

KojiDoi
KojiDoi

スコア13671

test CHANGED
@@ -1,8 +1,6 @@
1
1
  アルゴリズムに根本的な問題がありそうです。
2
2
 
3
- とりあえずサンプルを貼って置きます。後で時間に余裕ができたら、説明を追記します。
3
+ とりあえずサンプルを貼って置きます。
4
-
5
-
6
4
 
7
5
  ```perl
8
6
 
@@ -22,7 +20,9 @@
22
20
 
23
21
 
24
22
 
23
+ # データの準備
24
+
25
- while(<DATA>){
25
+ while(<DATA>){ # test5_2.csv に相当
26
26
 
27
27
  /^$/ and last;
28
28
 
@@ -30,13 +30,19 @@
30
30
 
31
31
  }
32
32
 
33
- while(<DATA>){
33
+ while(<DATA>){ # test5.csvに相当
34
34
 
35
35
  push(@test5, $_);
36
36
 
37
37
  }
38
38
 
39
39
 
40
+
41
+ ################################
42
+
43
+
44
+
45
+ # まず取得すべき値の範囲をA列のIDごとに記録しておく
40
46
 
41
47
  foreach (@test5_2){
42
48
 
@@ -53,6 +59,8 @@
53
59
  }
54
60
 
55
61
 
62
+
63
+ # 基準に合致している行だけprintする。
56
64
 
57
65
  foreach (@test5){
58
66
 
@@ -125,3 +133,11 @@
125
133
 
126
134
 
127
135
  ```
136
+
137
+
138
+
139
+ 面倒なのでデータをスクリプトの中に入れ込んでしまいましたが、適当にopen, while(<>)などの組み合わせに読み替えてください。
140
+
141
+
142
+
143
+ 質問文のコードでは、データの照合の際に、へんなforeachループを作ってしまって結局A列の値にかかわらずすべてのデータとの比較を試みてしまっているため、フィルタリングになっていません。%max, %minを用意して最大値最小値をまず格納しておき、これと対象データを比較するようにすれば目的が達成できます。