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);
} 

しかし、特定の行または特定の値を変更したい、つまり、2番目の行のすべての値または2番目の行の最初の列に1を追加します

4

2 に答える 2

3

またはを使用していますrow x columncolumn x row?1番とさせていただきます。

の値を変更するには$x, $y:

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

column に 1 を追加するには$x:

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

行に 1 を追加するには$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 配列は 0 からインデックス付けされることを思い出してください)としてアクセス可能であることが簡単にわかると思います。通常のスカラーと同じように、これらの値にアクセスして変更できます。

特定の例に関しては、2行目は@{$data[1]}、行のすべての要素をインクリメントできるようにするためです$_++ for @{$data[1]}。2 番目の行の 1 列目がインクリメントされます。$data[1][0]++

于 2012-08-27T14:39:01.953 に答える