2012-05-23 75 views
1

我想將二維數組複製到另一個數組中。但是,我遇到了一個奇怪的問題,第一行沒有被我的函數打印出來。但是,從第一行單獨打印出來的值就是打印出來的。在Perl中複製二維數組

這是我的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不打印第一行?任何幫助將不勝感激。 謝謝, 新手

+0

不贊成使用像這樣的'UNIVERSAL :: isa'。你應該'使用Scalar :: Util'reftype''然後'if(ref $ vHash和reftype $ vHash eq'ARRAY'){...}' – Borodin

回答

4

您必須總是use strictuse warnings在程序的開始,特別是要求你的代碼幫助之前。

假如你這樣做在這種情況下,你會被警告,你不能分配給$array2[0][0]

您已經初始化使用

@array2 = ""; 

其中一個元素創建一個數組,你的陣列等於空字符串("")。既然它有一個值,那麼Perl就無法自動生成第一個元素中的數組引用,因此分配失敗。

如果您啓用了strict,所有這些都會顯而易見。錯誤消息將準確解釋發生了什麼問題。

沒有必要,如果你想讓它空初始化一個新的數組,但這樣做的正確的方法是

@array =(); 
+0

OMG ...非常感謝!我浪費了這麼多時間...沒有意識到嚴格使用和使用警告已關閉......感謝您的解釋。 – Richeek

4

順便說一句,你不需要寫複印功能像這樣的。

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

dclone會對任何perl數據結構進行深層複製。

此外,如果您只需要打印此數據,則可以使用Data::Dumper

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