2012-05-23 7 views
1

다른 배열로 2D 배열을 복사하려고합니다. 그러나 첫 번째 행이 내 기능에 의해 인쇄되지 않는 이상한 문제가 발생합니다. 그러나 첫 번째 행을 별도로 인쇄 할 때 값이 인쇄되기 때문에 값이 있습니다.Perl에서 2D 배열 복사

#!/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 함수가 첫 번째 행을 인쇄하지 않는 이유는 무엇입니까? 어떤 도움을 주시면 감사하겠습니다. 감사합니다, 신참

+0

이와 같은 UNIVERSAL :: isa의 사용은 권장되지 않습니다. Scalar :: Util 'reftype ''을 사용하고'if (ref $ vHash와 reftype $ vHash eq'ARRAY ') {...}' – Borodin

답변

4

당신이해야 항상use strict 및 프로그램의 시작 use warnings, 특히 코드에 도움을 요청하기 전에. 이 경우 당신은 당신이 등 $array2[0][0]

에 할당 할 수 있다고 경고 한 것 때문에

당신은 당신은 하나 개의 요소로 배열을 만듭니다

@array2 = ""; 

를 사용하여 배열을 초기화 한했던 널 문자열 ("")과 같습니다. 이제는 값을 가지기 때문에 Perl은 첫 번째 요소의 배열 참조를 자동으로 초기화 할 수 없으므로 할당이 실패합니다.

strict을 사용하도록 설정 한 경우 모두 해당됩니다. 오류 메시지는 정확히 무엇이 잘못되었는지 설명합니다.

이 당신이 빈하려는 경우 새로운 배열을 초기화 할 필요는 없지만, 그렇게 할 수있는 올바른 방법이 그렇고

@array =(); 
+0

OMG ... 많이 고마워요! 나는 이것에 너무 많은 시간을 낭비했다 ... 엄격한 사용 경고가 꺼져 있다는 것을 깨닫지 못했다. 당신의 설명에도 감사한다. – Richeek

4

이 될 것입니다, 당신은이 같은 복사 기능을 작성할 필요가 없습니다 .

dclone은 모든 perl 데이터 구조의 전체 복사본을 만듭니다.

또한이 데이터를 인쇄하기 만하면 Data::Dumper을 사용할 수 있습니다.

use Data::Dumper; 
print Dumper(\@array), "\n"