首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在perl中存储本身不是引用的引用

问如何在perl中存储本身不是引用的引用
EN

Stack Overflow用户
提问于 2012-08-16 00:55:00
回答 3查看 174关注 0票数 1

我有一个递归函数,它使用ref递归遍历数据结构。如果ref返回空字符串,则调用回调。我的问题是,我需要在我的数据结构中存储一个hash-ref,它将被我的函数视为标量。

本质上,我需要做的就是做这样的事情;

代码语言:javascript
复制
    my %hash = fillHash();
    $hash{'abc'}{'def'} = \%hash;

我想知道是否有某种方法来存储\%hash,这样它就会被视为标量而不是引用。可能像/

代码语言:javascript
复制
     $hash{'abc'}{'def'} = scalar \%hash;

我只是在寻找一种方法,将链接添加到我的数据结构的父节点,同时仍然能够递归遍历它。

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-16 01:15:24

在您的示例中,它将如下所示:

代码语言:javascript
复制
 $hash{'abc'}{'def'} = scalar \\%hash;

ref( $hash{'abc'}{'def'} )就是'REF',如果你想知道的话。然后,您可以决定需要取消引用它两次:

代码语言:javascript
复制
$hash_ref = ${ $hash{'abc'}{'def'} };
票数 3
EN

Stack Overflow用户

发布于 2012-08-16 01:15:17

我认为@MarkCanlas在他的建议中有一个正确的解决方案,考虑一种不同的方式来组织你的数据。除此之外,您可以使用双重引用。

代码语言:javascript
复制
my $scalar_ref = \%hash;
$other_hash{abc}{def} = \$scalar_ref;

现在,当你检查它的ref时,你会得到"REF",并且可以做一些不同的事情。

票数 2
EN

Stack Overflow用户

发布于 2012-08-16 01:16:52

首先,你应该意识到所有的引用都是标量。

你想要的是一个在任何地方都可以作为引用的东西,除了在你的遍历函数中。这不是通过任何一种魔法引用就能实现的。步行函数是必须添加逻辑的地方。你可以让它跟踪它已经看到的东西:

代码语言:javascript
复制
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,然后跳过它们。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11973612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档