file.dat
私は次の問題を抱えています:次のフォーマットされたデータを持つファイル()から
1 2 3 4
2 1 3 4 5
3 1 2
4 1 2
5 2 6 7
6 5 8
7 5 8
8 6 7 9
9 8
私が見つけたい:
- 行の最初の要素が他の行に表示され、後続の行の最初の要素が試験で取得された行に表示される場合。
- 存在する場合は、「リンクxyが見つかりました」と出力します。
- 「リンク」が存在する場合は、試験で取得した行の他の要素がリンクが存在する行に表示される回数を数え、「z個の三角形が見つかりました」と出力します。
たとえば、この場合、プログラムが最初の行と2番目の行を比較し、「リンク1 2」が存在することを確認してから、「 2つの三角形が見つかりました」と記述します(各行に3と4の数字があるため) 。
この目的のために、私は次のプログラムを書こうとしました。
use strict;
use warnings;
use diagnostics;
use Data::Dumper;
############ DATA ABSORTION
my $file = 'file.dat';
open my $fh, "<", $file or die "Cannot open $file: $!";
############ COLLECT THE DATAS IN A VECTOR as vector[i][j]
my @vector;
while (<$fh>) {
push @vector, [ split ];
}
############ START THE RESEARCH OF THE LINKS AND TRIANGLES BY MEANS OF FOR LOOPS
my @link;
my $triangles;
for (my $i=0 ; $i < scalar @vector; $i++){
$triangles=0;
for(my $j=0; $j < scalar @vector; $j++){
for (my $k=$i+1; $k < scalar @vector; $k++){
for(my $l=0; $l < scalar @vector; $l++){
if($vector[$i][0]==$vector[$k][$l] && $vector[$i][$j]==$vector[$k][0] && $l != 0 && $j != 0) {
@link=($vector[$i][0],$vector[$k][0]);
print "I found the link @link\n";
if($vector[$i][$j]==$vector[$k][$l] && $l != 0 && $j != 0 && $i != $k){
$triangles++;
}
print "The number of triangles is $triangles\n\n";
}
}
}
}
}
プログラムは正しい数のリンクを出力しますが、行数がファイル内の列数よりも少ない場合、プログラムは行全体を読み取らないため、これは私のリンク調査で問題になる可能性があります。問題はscalar @vector
、命令の上限にあると思います(しかし、理由はわかりません)。
2番目の問題は、私が探している三角形の正しい数がカウントされないことです...何か助けはありますか?