我有以下问题:来自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 个三角形”。
例如在这种情况下,当程序比较第一行和第二行并发现“链接 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
在 for 指令的上限(但我不明白为什么)。
第二个问题是它不计算我正在寻找的正确数量的三角形......有什么帮助吗?