查找文件中的常用元素

时间:2013-03-06 10:05:09

标签: perl

我想写的程序与File row confrontation具有相同的目标。这次我的文件以不同的方式放置:

1 2
1 3
1 4
2 1
2 3
2 4
2 5
3 1
...
8 6
8 7
8 9
9 8

我想找到:

  1. 当一行的第一个元素出现在其他行的第二个位置,并且后续行的第一个元素出现在考试中的行旁边时;
  2. 如果发现那么我想打印“我找到了链接x y”;
  3. 如果存在“链接”,那么我想要计算它们共享的“邻居”数量,其中eighbours我的意思是他们共有的第二列中有多少元素并打印“我找到了z三角形”。
  4. 文件已排序。

    在这种情况下,程序将开始在文件中创建第一个“couple”1 2但反转,它将在第4行(2 1)找到它。然后它查看3(第二行和1的邻居)是否也存在于2中(并且情况是因为它存在2 3),依此类推。最后它会发现“有链接1 2”并且“找到2个三角形”(1 - 2 - 3和1 - 2 - 4)。我认为答案与上层链接中的答案不一样,但我不知道如何从这样的文件中排列文件。

1 个答案:

答案 0 :(得分:0)

问题的第一部分是只查找反向匹配对的索引?在昨天阅读这个问题时,我觉得grep可能有用;

#!usr/bin/perl

use warnings;
use strict;

my @parry;

while (<DATA>){
push @parry, [split(' ',$_)];
}

#@remind is reverse matched indices;

my @remind = grep {
my $ind = $_;
   grep {  #reverse @{$parry[$_]} == @{parry[$ind]} did not appear to work.

      @{$parry[$_]}[0] == @{$parry[$ind]}[1] && 
      @{$parry[$_]}[1] == @{$parry[$ind]}[0];

   } 0..$#parry 

} 0..$#parry;

grep { print $_,': ',@{$parry[$_]},$/ } @remind;

__END__
1 2
1 3
1 4
2 1
2 3
2 4
2 5
3 1
8 6
8 7
8 9
9 8

输出

0: 12
1: 13
3: 21
7: 31
10: 89
11: 98

从这里你想找到发言权     7 [0] 7 [1](3 1)与邻居行6和8与col 2?

     6[1]
     7[1] (1 5) and/or

     7[1] (1 6) exist in the original set (in @parry)?
     8[1] 

他们不是没有三角形。