プロが教えるわが家の防犯対策術!

皆様のお知恵を拝借したく投稿しました。
よろしくお願いします。

perlでのデータ処理で2つの入力ファイルがあります
list1
----------------
start end
110
1216
2030
3442
----------------

list2
-----------------
start end
1 5
6 12
14 18
20 28
30 35
37 42
-----------------

この2つのファイルを比較して
(1)list1から見たlist2と重複している領域の個数
(2)list2から見たlist1と重複している領域の個数
(3)重複している領域の長さ

を算出し、出力できるようにperlでコーディングしたいのですが
どのようにしたらよいのでしょうか?

ご助言いただけますと幸いです

A 回答 (2件)

とりあえず (1) のみ、作ってみました。



use strict;
my @list_1 = ([1, 10], [12, 16], [20, 30], [34, 42]);
my @list_2 = ([1, 5], [6, 12], [14, 18], [20, 28], [30, 35], [37, 42]);
my @overlap = join(':', sort { $a <=> $b }
map { $_->[0] .. $_->[1] } @list_1, @list_2) =~ /\b(\d+):\1/g;

my $count;
foreach my $ref (@list_1) {
foreach my $n ($$ref[0] .. $$ref[1]) {
$count++ if grep /^$n$/, @overlap;
}
print "$ref->[0] $ref->[1]: $count\n";
$count = 0;
}

foreach の引数の @list_1 を @list_2 に変更すれば、(2) を出力できます。
(3) は、どのような出力にすればよいのかよく分かりません。
    • good
    • 0
この回答へのお礼

ありがとうございます!
(3)についてもその後、解決できました
ご助言ありがとうございました

お礼日時:2007/12/21 10:28

....


「2つの領域に対し, 重複している部分の長さ」を求めるサブルーチンを作ってください.
    • good
    • 0
この回答へのお礼

ありがとうございます!
早速試してみます

お礼日時:2007/12/21 10:27

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