Re: [問題] 刪除或清空整個hash ?
※ 引述《abliou (把青春freeze)》之銘言:
: 這個文章讓我想到幾個問題..不過還是想不透...
: 就是由上面(1)中...輸入到%h的匿名雜湊還會有value嗎?(undef??)
: 然後再往後延伸一個問題...若我想要取出那個匿名雜湊的key-value要怎麼做?
: 我寫了一小段..
: %h=({'ty'=>'g'},"ll");
: $h{'a'}=b ;
: print @{[keys(%h)]}[1] . $/ ;
: print ${@{[keys(%h)]}[1]}{'ty'} ;
: ===輸出===
: HASH(0X288b0c)
: ==========
: 好像還是取不出hash那個的value...
關於第一個問題,
你是想問像 %h = ('key') 這樣指定的話 $h{key} 的 value 是什麼嗎?
use Data::Dumper;
my %h = ('key');
print Dumper($h{key});
答案是 undef
不過如果有宣告 use warnings; 的話 perl 會警告你 %h 只包含了奇數個元素
而匿名雜湊不可以直接當成雜湊的 key 使用,如
my %h = ( { 'ty' => 'g' } => 'll', a => 'b' ); # doesn't work!
就算可以,因為不同的匿名雜湊是不同的 reference,
所以 $h{{'ty' => 'g'}} 也不是 'll'!
由 http://perldoc.perl.org/perlfaq4.html
How can I use a reference as a hash key?
可知,hash 的 key 一定是 string
所以會如果在 key 中使用 reference 就會出現如你所看到的 HASH(0X288b0c)
基本上你是無法從 HASH(0X288b0c) 去反推原始的 object 的
不過 faq4 提供了兩種解決辦法:
第一種是使用 Hash::Util::FieldHash 這個 module (5.10 後是 core module)
範例如下:
use Hash::Util qw(fieldhash);
use Hash::Util::FieldHash qw(id_2obj);
use Data::Dumper;
fieldhash my %h;
my $foo = { 'ty' => 'g' };
%h = ( $foo => 'll', a => 'b' );
for my $key (keys(%h)) {
my $obj = id_2obj($key);
print Dumper(defined $obj ? $obj : $key)
}
其輸出結果為 (%h 包含了兩個 key):
$VAR1 = 'a';
$VAR1 = {
'ty' => 'g'
};
fieldhash 會定義一特殊的 hash,主要是用來實作 inside-out class
,請參考 http://perldoc.perl.org/Hash/Util/FieldHash.html
另一個方法是使用 Tie::RefHash 這個 module
它可將 reference 真正當成 hash key 來使用
範例如下:
use Data::Dumper;
use Tie::RefHash;
tie my %h, 'Tie::RefHash';
my $foo = { 'ty' => 'g' };
%h = ( $foo => 'll', a => 'b' );
for my $key (keys(%h)) {
print Dumper($key);
}
其輸出結果為:
$VAR1 = {
'ty' => 'g'
};
$VAR1 = 'a';
上面兩種方法都可以由 $h{$foo} 得到 'll'
最後,在將 reference 當成 hash key 時要特別小心
以免產生奇怪的 bug,或是造成 memory leak
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.59.233.171
推
09/04 09:22, , 1F
09/04 09:22, 1F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 3 之 3 篇):
Perl 近期熱門文章
PTT數位生活區 即時熱門文章