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

如何在perl中存储本身不是引用的引用,perl,Perl,我有一个递归函数,用于递归地遍历数据结构。如果ref返回空字符串,则调用回调。我的问题是,我需要在我的数据结构中存储一个hash ref,它将被我的函数视为标量 本质上,我需要做的是这样的事情 my %hash = fillHash(); $hash{'abc'}{'def'} = \%hash; 我想知道是否有某种方法可以将\%散列存储为标量而不是引用。可能像/ $hash{'abc'}{'def'} = scalar \%hash; 我只是在寻找一种方法,向数据

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

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

    my %hash = fillHash();
    $hash{'abc'}{'def'} = \%hash;
我想知道是否有某种方法可以将\%散列存储为标量而不是引用。可能像/

     $hash{'abc'}{'def'} = scalar \%hash;
我只是在寻找一种方法,向数据结构的父节点添加链接,但仍然能够递归地遍历它


我认为MarkCanlas在他的建议中有一个正确的解决方案:考虑用不同的方式来构造你的数据。除此之外,你可以做双重证明

my $scalar_ref = \%hash;
$other_hash{abc}{def} = \$scalar_ref;

<> P>现在,当你检查它的REF时,你会得到回复并且可以做一些不同的事情。

< P>我认为MarkCanlas在他的建议中有一个正确的解决方案来考虑一种不同的方式来构造你的数据。除此之外,你可以做双重证明

my $scalar_ref = \%hash;
$other_hash{abc}{def} = \$scalar_ref;

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

你可以用我所做的区分值和结构,我称它们为间接数组

在您的情况下,它将如下所示:

 $hash{'abc'}{'def'} = scalar \\%hash;
ref$hash{'abc'}{'def'}是'ref',如果您想知道的话。然后,您可以决定需要将其解引用两次:

$hash_ref = ${ $hash{'abc'}{'def'} };

您可以使用我所做的来区分值和结构,在我的例子中,我称它们为间接数组

在您的情况下,它将如下所示:

 $hash{'abc'}{'def'} = scalar \\%hash;
ref$hash{'abc'}{'def'}是'ref',如果您想知道的话。然后,您可以决定需要将其解引用两次:

$hash_ref = ${ $hash{'abc'}{'def'} };

首先,您应该认识到,根据定义,所有引用都是标量

你想要的是一个在任何地方都可以作为参考的东西,但是在你的行走功能里面。这不是真的可以通过任何形式的魔法参考来实现的。步行功能是必须添加逻辑的地方。您可以让它跟踪已看到的内容:

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)识别为特殊键并跳过它们。

首先,您应该认识到,根据定义,所有引用都是标量

你想要的是一个在任何地方都可以作为参考的东西,但是在你的行走功能里面。这不是真的可以通过任何形式的魔法参考来实现的。步行功能是必须添加逻辑的地方。您可以让它跟踪已看到的内容:

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键)识别为特殊键,然后跳过它们。

您正在尝试在圆孔中插入方形销钉。为什么不重新设计您的函数/数据结构,这样您就不必求助于奇怪的扭曲?那么您想要这样的东西吗?我的$href={fill_Hash}$散列{abc}{def}=\$href;你想把一个方形的钉子装进一个圆孔里。为什么不重新设计您的函数/数据结构,这样您就不必求助于奇怪的扭曲?那么您想要这样的东西吗?我的$href={fill_Hash}$散列{abc}{def}=\$href;