要獲得
"a" => $tree = "a";
"a", "a/b" => $tree = { "a" => "b" };
"a", "a/b", "a/b/c" => $tree = { "a" => { "b" => "c" } };
"a", "a/b", "a/c" => $tree = { "a" => { "b" => undef, "c" => undef } };
代碼:
my $tree;
for ("a", "a/b", "a/b/c") {
my @keys = split qr{/};
my $val = pop(@keys);
my $p = \$tree;
while (@keys) {
my $key = shift(@keys);
$$p = { $$p => undef } if !ref($$p);
$p = \(($$p)->{$key});
}
if (defined($$p)) {
$$p = { $$p => undef } if !ref($$p);
($$p)->{$val} = undef;
} else {
$$p = $val;
}
}
但既然你需要使用ref
瀏覽它,這不是一個很好的數據結構。相反,我建議
"a" => $tree = { "a" => undef };
"a", "a/b" => $tree = { "a" => { "b" => undef } };
"a", "a/b", "a/b/c" => $tree = { "a" => { "b" => { "c" => undef } } };
"a", "a/b", "a/c" => $tree = { "a" => { "b" => undef, "c" => undef } };
代碼:
my $tree;
for ("a", "a/b", "a/b/c") {
my $p = \$tree;
$p = \(($$p)->{$_}) for split qr{/};
}
看到它是多麼簡單建立這個數據結構?當您嘗試導航時,您會獲得類似的好處。
請注意,您可以使用Data::Diver創建第二個數據結構(雖然我記得它是慢得多)。
use Data::Diver qw(DiveRef);
my $tree;
for ("a", "a/b", "a/b/c") {
DiveRef($tree //= {}, \split(qr{/}));
}
不要使用正則表達式。 –
如何處理''a「'輸入?在這種情況下,值應該是什麼並不明顯,並且散列不能只有一個鍵。 –
如果這是您正在嘗試解析的路徑,請改爲使用「File :: Spec」模塊splitdir。 – TLP