[英]perl how to reference hash itself
這似乎是一件奇怪的事情,但是當我在哈希自身內部時如何引用哈希呢? 這是我想做的事情:
我在哈希表的末尾有一個子哈希,例如:
my $h = { A => [...], B => [...], ..., EXPAND => sub { ... } };
。 我正在尋找實現EXPAND
以查看此哈希中是否存在鍵C
,如果存在,則插入另一個鍵值對D
所以我的問題是,如何在不使用哈希的變量名的情況下將對哈希的引用傳遞給子對象? 我希望需要對一些哈希值執行此操作,並且我不想繼續更改子項以引用其當前所在哈希的名稱。
您所擁有的是一些嵌套數組引用,而不是哈希。 假設您實際上是說您有類似以下內容:
my $h = { A => {...}, B => {...}, ..., EXPAND() };
在那種情況下,您不能從其自己的定義中引用$h
,因為$h
在表達式完全求值之前不存在。
如果您願意將其設置為兩行,則可以執行以下操作:
my $h = { A=> {...}, B => {...} };
$h = { %$h, EXPAND( $h ) };
通用解決方案是編寫一個給定哈希值的函數和一個擴展該哈希值的函數,然后將哈希值與添加的擴展函數一起返回。 我們可以在擴展函數中關閉哈希,這樣就不需要在其中提及哈希的名稱。 看起來像這樣:
use strict;
use warnings;
use 5.010;
sub add_expander {
my ($expanding_hash, $expander_sub) = @_;
my $result = { %$expanding_hash };
$result->{EXPAND} = sub { $expander_sub->($result) };
return $result;
}
my $h = add_expander(
{
A => 5,
B => 6,
},
sub {
my ($hash) = @_;
my ($maxkey) = sort { $b cmp $a } grep { $_ ne 'EXPAND' } keys %$hash;
my $newkey = chr(ord($maxkey) + 1);
$hash->{$newkey} = 'BOO!';
}
);
use Data::Dumper;
say Dumper $h;
$h->{EXPAND}->();
say Dumper $h;
注意,我們正在創建$h
但是add_expander
調用中沒有提到$h
。 而是,傳遞給調用的子程序將其打算擴展的哈希作為其第一個參數。 在子項的哈希上運行add_expander
會創建一個閉包,該閉包將記住擴展程序與哪個哈希關聯並將其合並到哈希中。
該解決方案假定散列擴展時發生的情況可能因主題散列而異,因此add_expander
采用任意子集。 如果不需要那種自由度,可以將擴展子合並到add_expander
。
(可能)正在建立的哈希發生在EXPAND()
運行之后。 我可能會使用這樣的東西:
$h = EXPAND( { A=>... } )
如果原始文件需要保持原樣,則EXPAND(...)
返回修改后的hashref或副本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.