Perl:增加2d阵列单元?

时间:2013-05-03 16:32:43

标签: perl multidimensional-array

我有一组数值数据对我来说很重要,知道一起出现的数字对,以及多少次。每组数据包含1和20之间的7个数字。有数百组数据。

基本上,通过解析我的每一组数据,我想创建一个20 x 20的数组,我可以用它来计算数字对一起出现的数量。

我做了很多搜索,但也许我使用了错误的关键词。我已经看到了大量的例子如何创建一个“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]=@data[$prcount]+1;
        @data[$othcount]=@data[$othcount]+1;
        @data[$prcount]=@data[$prcount]-1;
        @data[$othcount]=@data[$othcount]-1;
        print @data[$prcount]." ".@data[$othcount]."; ";
        #@datapairs[@data[$prcount]][@data[$othcount]]++;
        #@datapairs[@data[$othcount]][@data[$prcount]]++;
    }
  }
}

非常感谢任何意见或建议。

1 个答案:

答案 0 :(得分:0)

要在Perl中访问“2-d数组”中的“单元格”(正如你想的那样,它是一个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";
}

作为旁注,就个人而言,出于文体方面的原因,我更倾向于参考一切,例如:使用arrayrefs的arrayref而不是array数组。 E.g。

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

第二个(和第三个......)箭头解除引用运算符在Perl中是可选的,但是我个人发现它可以强制执行它的使用 - 它会使索引表达式空出来。