我有一组数值数据对我来说很重要,知道一起出现的数字对,以及多少次。每组数据包含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]]++;
}
}
}
非常感谢任何意见或建议。
答案 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中是可选的,但是我个人发现它可以强制执行它的使用 - 它会使索引表达式空出来。