2

2D 配列を別の配列にコピーしようとしています。ただし、関数によって最初の行が出力されないという奇妙な問題が発生しています。ただし、最初の行を個別に印刷すると印刷されるため、値は存在します。

これは私のperlコードです:

#!/usr/bin/perl
use UNIVERSAL 'isa';

#Function to print the contents of an array
sub printArray {
    my ($vHash) = @_;
    if (isa($vHash, 'ARRAY')) {
        foreach my $el (@$vHash) {
            print "A: $el\n";
            printArray($el);
        }
    } else {
        return;
    }
    return;
}

my @array = "";
my @line1 = (1, 2, 3);
my @line2 = (3, 4, 5);
my @line3 = (6, 7, 8);

#Creating a 2D array
@array = (\@line1, \@line2, \@line3);

my @array2 = "";
my $row_size = @array;
print "ROW SIZE: $row_size\n";
my $column_size = @{$array[0]};
print "COL Size: $column_size\n\n\n";

#Copying over the 2D array...element by element
for (my $i=0; $i<$row_size; ++$i) {
    for (my $j=0; $j<$column_size; ++$j) {
        $array2[$i][$j] = $array[$i][$j];
    }
}

print "\n\nORIG ARRAY\n\n";
printArray(\@array);
print "\n\nCOPY ARRAY\n";
printArray(\@array2);

print "\n\n";

#Printing the first row separately
foreach my $ele (@{$array2[0]}) {
    print "V: $ele\n";
}

これはプログラムの出力です:

ROW SIZE: 3
COL Size: 3




ORIG ARRAY

A: ARRAY(0x65b110)
A: 1
A: 2
A: 3
A: ARRAY(0x65b170)
A: 3
A: 4
A: 5
A: ARRAY(0x65b1d0)
A: 6
A: 7
A: 8


COPY ARRAY
A:                                                     #WHY THIS IS MISSING
A: ARRAY(0x6d1f00)
A: 3
A: 4
A: 5
A: ARRAY(0x6d1f50)
A: 6
A: 7
A: 8


V: 1                                                  #THESE VALUES ARE COMING FINE
V: 2
V: 3

私はここで何が間違っているのか本当に混乱しています!! 関数 printArray が最初の行を印刷しないのはなぜですか? どんな助けでも大歓迎です。ありがとう、初心者

4

2 に答える 2

5

ちなみに、このようなコピー関数を書く必要はありません。

use Storable qw(dclone);
my @array2 = @{ dclone(\@array) };

dcloneperl データ構造のディープ コピーを作成します。

さらに、このデータを印刷するだけでよい場合は、そのまま使用できますData::Dumper

use Data::Dumper;
print Dumper(\@array), "\n"
于 2012-05-23T18:56:36.590 に答える
3

特にコードについて助けを求める前に、常に プログラムの開始時に行う必要がuse strictあります。use warnings

この場合、割り当てを行うことができない$array2[0][0]などの警告が表示されます。

を使用して配列を初期化しました

@array2 = "";

null 文字列に等しい 1 つの要素を持つ配列を作成します("")。値が設定されたので、Perl は最初の要素の配列参照を自動有効化できないため、割り当ては失敗します。

を有効にしていれば、これらすべてが明らかですstrict。エラーメッセージは、何がうまくいかなかったのかを正確に説明します。

空にしたい場合は新しい配列を初期化する必要はありませんが、正しい方法は次のようになります。

@array = ();
于 2012-05-23T18:22:06.220 に答える