1

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

#!/usr/bin/perl -w

@arr1 = (10,20,30);
@arr2 = (10,20,30);
@arr3 = (10,20,30);
@ref_arr = (\@arr1, \@arr2, \@arr3);

print"Prog starts\n";          

foreach $ref (@ref_arr) {
  #print @$ref->[0];
  foreach $val (@$ref) { 
    print "$val ";
  }
  print"\n";
}

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

示例:将每个值增加 1

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

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

4

2 回答 2

3

你是用row x column还是column x row?我将假设第一个。

要修改 处的值$x, $y

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

要将 1 添加到 column $x

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

要将 1 添加到 row $y

$_->[$y]++ for @ref_arr;
于 2012-08-27T11:11:06.937 回答
2

您必须始终 use strict并在您编写的每个程序use 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]++

于 2012-08-27T14:39:01.953 回答