我正在尝试将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函数不能打印第一行?任何帮助将受到高度赞赏。 谢谢, 新手
答案 0 :(得分:4)
您必须在程序开始时始终 use strict
和use warnings
,特别是在向您的代码寻求帮助之前。
如果您在这种情况下这样做,您会收到警告,您无法分配给$array2[0][0]
等。
您已使用
初始化了数组@array2 = "";
创建一个数组,其中一个元素等于空字符串("")
。现在它有一个值,Perl无法为您自动生成第一个元素中的数组引用,因此您的分配失败。
如果您启用了strict
,那么所有这一切都会很明显。错误消息可以准确解释出现了什么问题。
如果你想让它变空,就没有必要初始化一个新数组,但正确的方法是
@array = ();
答案 1 :(得分:4)
顺便说一句,您不需要像这样编写复制函数。
use Storable qw(dclone);
my @array2 = @{ dclone(\@array) };
dclone
会对任何perl数据结构进行深层复制。
此外,如果您只需要打印此数据,则可以使用Data::Dumper
。
use Data::Dumper;
print Dumper(\@array), "\n"