簡體   English   中英

在Perl中復制2D數組

[英]Copying 2D array in Perl

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

您必須始終在程序開始時始終 use strictuse warnings ,尤其是在尋求代碼幫助之前。

如果您在這種情況下這樣做,將被警告您無法分配給$array2[0][0]等。

您已經使用初始化了數組

@array2 = "";

它創建一個數組,該數組的一個元素等於空字符串("") 現在它已經有了一個值,Perl將無法為您自動調整第一個元素中的數組引用,因此您的分配將失敗。

如果啟用了strict那么所有這些都將顯而易見。 錯誤消息將確切說明出了什么問題。

如果您希望將其清空,則無需初始化新數組,但是正確的方法是

@array = ();

順便說一句,您不需要編寫像這樣的復制功能。

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

dclone可以復制任何perl數據結構。

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM