下午修改一段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...