Perl中雜湊結構的深度拷貝

2021-06-07 01:21:55 字數 1584 閱讀 1695

下午修改一段perl**的時候,遇到了乙個深度拷貝的問題。廢話少說,上**:

my ($rc, $refdata) = db_query($sql_text, "hashref");

unless ($rc)

my @arrayhash = ();

foreach my $ref (@$refdata) 的值為"10.136.142.205,127.0.0.1"

if (defined($ref->)

&& $ref-> eq "y"

&& defined($ref->))

)) = $host;

if ($ref-> eq "127.0.0.1")

push @arrayhash, $ref;}}

else

}foreach my $tmp (@arrayhash) eq "127.0.0.1")

}

上面這段**用於將資料庫中的記錄集存入乙個hash陣列,這段**的執行結果在1處列印兩次,但在3處卻列印4次。顯然不符合預期。

多出來的兩條記錄哪兒來的呢,唯一可能的就是內層的foreach以及push過程:

於是修改內層foreach**為深度拷貝如下,測試ok:

foreach my $host (split(/,/, $ref->))  = $ref-> foreach keys %$ref;

$elem-> = $host;

push @arrayhash, $elem;

}

原來在內層foreach中$ref被修改時,並沒有執行copyonwrite(寫時複製)的過程,而是直接修改了$ref指向內容的值,即這裡一直是淺拷貝。從而導致$ref指向的變數被修改,然後又被覆蓋,改為深度拷貝後問題解決。

上面的深度拷貝只能拷貝一層hash結構,如果資料結構更複雜一點便無法支援,這裡提供乙個支援任意複雜程式基於遞迴的深度拷貝函式:

use scalar::util qw(reftype refaddr);

sub real_copy

if (exists($cloned->));

my ($ref_type, $copy) = reftype($value);

if ($ref_type eq 'array') = $copy;

push(@$copy, map @$value);

}elsif ($ref_type eq 'hash') ;

$cloned-> = $copy;

foreach my $key (keys(%)) = real_copy($value->, $cloned);}}

elsif ($ref_type eq 'scalar') ;

$cloned-> = $copy;

}elsif ($ref_type eq 'ref') = $copy;

}else = $copy;

$tmp = real_copy($$value, $cloned);}}

return $copy;

}

perl 中的雜湊賦值

在perl 中,通過 動態的給雜湊賦值,是最常見的應用場景,但是有些情況下,我們事先知道一些資訊,當需要把這些資訊存放進乙個雜湊的時候,直接給雜湊賦值就好 雜湊的key不用說,就是乙個字串,關鍵是value,大概有下面3種 1 乙個值 就是乙個普通的一維雜湊,直接賦值即可 示例 my hash a ...

PERL中的雜湊表操作

雜湊表究其實質而言就是一種資料結構,可以隨機訪問,沒有上限,但是不同之處則在於陣列呢,是根據陣列來確定所要求的資料在陣列中的偏移量,而雜湊則是以名字來進行檢 索,或者說作為索引值的,也就是說檢索用的鍵不是數字,而是保證唯一性的字串,即鍵值,鍵值必須保持唯一性!需要指出的是,雖然雜湊表的鍵的名稱要求必...

perl 中的雜湊作為多維陣列 結構體使用

可以用雜湊來構成我們在c中常見的多維陣列,如下 usr bin perl num 1 1.5 2 6.10 3 11.15 4 16.20 5 21.25 這是一種構建方法,也可以用下面的方法 num 1.5 num 6.10 num 11.15 num 16.20 num 21.25 foreac...