我有一组数值数据,这对我来说很重要,因为我知道哪些数字对一起出现,以及出现了多少次。每组数据包含7个1到20之间的数字。有几百组数据。
本质上,通过解析我的每组数据,我想创建一个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]]++;
}
}
}
在Perl中访问"二维数组"中的"单元格"(正如您已经发现的,这是一个数组ref的数组)非常简单:
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";
}
作为旁注,就个人而言,出于风格原因,我强烈倾向于引用一切,例如使用arrayref of arrayref而不是array of arrays。例如
my $datapairs;
# Add 1 for a pair with indexes $i and $j
$datapairs->[$i]->[$j]++;
print that value
print "$datapairs->[$i]->[$j]n";
第二个(和第三个…)箭头解引用操作符在Perl中是可选的,但我个人发现强制使用它明显更具可读性——它将索引表达式分隔开。