1

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

本质上,通过解析我的每组数据,我想创建一个 20 x 20 的数组,我可以用它来记录成对的数字何时一起出现。

我做了很多搜索,但也许我使用了错误的关键词。我已经看过很多如何创建“二维数组”的示例——我知道 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]]++;
    }
  }
}

任何意见或建议将不胜感激。

4

1 回答 1

0

要在 Perl 中访问“二维数组”中的“单元格”(正如您已经知道的,它是一个 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。例如

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

第二个(和第三个...)箭头取消引用运算符在 Perl 中是可选的,但我个人发现强制使用它的可读性要高得多——它将索引表达式隔开。

于 2013-05-03T16:35:51.437 回答