2013-05-03 34 views
1

我有一组数字数据,对于我来说知道哪些数字对一起出现以及数次是重要的。每组数据包含1到20之间的7个数字。有数百组数据。基本上,通过解析每一组数据,我想创建一个20 x 20的数组,我可以使用这个数组来保持一对数字在一起出现时的计数。Perl:增加2d数组单元格?

我已经做了很多搜索,但也许我使用了错误的关键词。我见过大量的例子,如何创建一个“2D数组” - 我知道perl实际上并没有这样做,并且它确实是一个引用数组 - 并且打印其中包含的值,但没有真正关于如何工作用一个特定的单元格编号并改变它。

下面是我的概念代码。注释行不起作用,但说明了我想实现的目标。我对编写perl有新意,而且这似乎提高了我理解我见过的例子并将其转化为我实际可以使用的例子。

my @datapairs; 
while (<DATAFILE>) 
{ 
    chomp; 
    my @data = split(",",$_); 
    for ($prcount=0; $prcount <=5; $prcount++) 
    { 
    for ($othcount=($prcount+1); $othcount<=6; $othcount++) 
    { 
     @data[$prcount][email protected][$prcount]+1; 
     @data[$othcount][email protected][$othcount]+1; 
     @data[$prcount][email protected][$prcount]-1; 
     @data[$othcount][email protected][$othcount]-1; 
     print @data[$prcount]." "[email protected][$othcount]."; "; 
     #@datapairs[@data[$prcount]][@data[$othcount]]++; 
     #@datapairs[@data[$othcount]][@data[$prcount]]++; 
    } 
    } 
} 

任何输入或建议将不胜感激。

回答

0

要在Perl中的“2-d阵列”访问“细胞”(如你alredy想通了,这是arrayrefs数组),很简单:

my @datapairs; 
# Add 1 for a pair with indexes $i and $j 
$datapairs[$i]->[$j]++; 
print that value 
print "$datapairs[$i]->[$j]\n"; 

目前尚不清楚你的意思由“一起出现的” - 如果你“相同的长度-7阵列”的意思,这很容易:

my @datapairs; 
while (<DATAFILE>) { 
    chomp; 
    my @data = split(",", $_); 
    for (my $prcount = 0; $prcount <= 5; $prcount++) { 
     for (my $othcount = $prcount + 1; $othcount <=6 ; $othcount++) { 
      $datapairs[ $data[$prcount] ]->[ $data[$othcount] ]++; 
     } 
    } 
} 
# Print 
for (my $i = 0; $i < 20; $i++) { 
    for (my $j = 0; $j < 20; $j++) { 
     print "$datapairs[$i]->[$j], "; 
    } 
    print "\n"; 
} 

作为一个侧面说明,个人,只是风格上的原因,我强烈希望引用EVERYTHING ,例如使用arrayrefs的arrayref而不是阵列数组。例如。

my $datapairs; 
# Add 1 for a pair with indexes $i and $j 
$datapairs->[$i]->[$j]++; 
print that value 
print "$datapairs->[$i]->[$j]\n"; 

第二个(第三...)箭头引用操作是可选在Perl,但我个人觉得显著更具可读性强制执行其用途 - 它的空间了索引表达式。

+0

我很坦白地说,在阅读了多个代码示例之后,我不明白这一点。谢谢。 – BretCB 2013-05-03 16:41:45

+0

@BretCB - 正如你所说,可能术语不是很熟悉。一旦你练习5-10次,你会发现它的第二天性。 – DVK 2013-05-03 16:43:15