访问Perl 2x2数组的单个元素



我可以使用以下代码创建矩阵

#!/usr/bin/perl -w
@arr1 = (10,20,30);
@arr2 = (10,20,30);
@arr3 = (10,20,30);
@ref_arr = (@arr1, @arr2, @arr3);
print"Prog startsn";          
foreach $ref (@ref_arr) {
  #print @$ref->[0];
  foreach $val (@$ref) { 
    print "$val ";
  }
  print"n";
}

使用map函数,我可以像这个一样修改矩阵中的每个值

示例:将每个值增加1

foreach $ref (@ref_arr) {
  map($_++, @$ref);
} 

但我想修改某一行或某个特定值,即在第二行的所有值或第二行的第一列上加1

您使用的是row x column还是column x row?我先假设一下。

修改$x, $y:处的值

$ref_arr[$x][$y] = $new_value;

将1添加到列$x:

$_++ for @{ $ref_arr[$x] };

$y行添加1:

$_->[$y]++ for @ref_arr;

您必须始终use strictuse warnings位于您编写的每个程序的顶部。这一点尤其适用于您请求代码帮助的情况,因为这些措施会揭示一些简单的错误,否则您会忽略

map函数是而不是用于迭代列表:它是通过将函数应用于源列表的每个元素来将一个列表"映射"到另一个列表

当你写

map($_++,@$ref)

您正在构建并丢弃@list中的值的副本。你应该写的是

$_++ for @$ref

至于如何修改数组中的单个值,您的数组初始化可以简化为

my @data = (
    [10, 20, 30], 
    [10, 20, 30], 
    [10, 20, 30]
)

我希望从中可以更容易地看到,结构中的第一个10可以作为$data[0][0]访问,比如说,最后一个20$data[2][1](记住Perl数组是从零开始索引的)。您可以访问和修改这些值,就像任何普通的标量一样

对于您的特定示例,第二行是@{$data[1]},因此您可以通过写入$_++ for @{$data[1]}来增加该行的每个元素。第二行的第一列使用$data[1][0]++ 递增

最新更新