我有一个递归函数,它使用ref递归遍历数据结构。如果ref返回空字符串,则调用回调。我的问题是,我需要在我的数据结构中存储一个hash-ref,它将被我的函数视为标量。
本质上,我需要做的就是做这样的事情;
my %hash = fillHash();
$hash{'abc'}{'def'} = \%hash;我想知道是否有某种方法来存储\%hash,这样它就会被视为标量而不是引用。可能像/
$hash{'abc'}{'def'} = scalar \%hash;我只是在寻找一种方法,将链接添加到我的数据结构的父节点,同时仍然能够递归遍历它。
谢谢
发布于 2012-08-16 01:15:24
在您的示例中,它将如下所示:
$hash{'abc'}{'def'} = scalar \\%hash;ref( $hash{'abc'}{'def'} )就是'REF',如果你想知道的话。然后,您可以决定需要取消引用它两次:
$hash_ref = ${ $hash{'abc'}{'def'} };发布于 2012-08-16 01:15:17
我认为@MarkCanlas在他的建议中有一个正确的解决方案,考虑一种不同的方式来组织你的数据。除此之外,您可以使用双重引用。
my $scalar_ref = \%hash;
$other_hash{abc}{def} = \$scalar_ref;现在,当你检查它的ref时,你会得到"REF",并且可以做一些不同的事情。
发布于 2012-08-16 01:16:52
首先,你应该意识到所有的引用都是标量。
你想要的是一个在任何地方都可以作为引用的东西,除了在你的遍历函数中。这不是通过任何一种魔法引用就能实现的。步行函数是必须添加逻辑的地方。你可以让它跟踪它已经看到的东西:
my %h = (
foo => "bar",
inner => {
foo => 42
}
);
$h{inner}{parent} = \%h;
sub walk
{
my ($h, $cb, $path, $seen) = @_;
$path //= "";
$seen //= {};
$seen->{$h}=1;
while(my ($k, $v) = each %$h) {
if(ref($v)) {
walk($v, $cb, "$path/$k", $seen) if !$seen->{$v};
} else {
$cb->($k, $v, "$path/$k");
}
}
}
walk(\%h, sub {
my ($key, $value, $path) = @_;
print "walker found $key ($path) => $value\n";
});或者你可以让它识别特定的关键字,比如parent,然后跳过它们。
https://stackoverflow.com/questions/11973612
复制相似问题