Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl中的散列值本质上是内存位置吗?_Perl_Hash_Reference - Fatal编程技术网

Perl中的散列值本质上是内存位置吗?

Perl中的散列值本质上是内存位置吗?,perl,hash,reference,Perl,Hash,Reference,我有个问题。 如果我将一个散列a的值分配给另一个散列B,然后更改散列B的值,则散列a也会更改。我如何避免这种情况 例如 现在$hashB{a}{b}{c}=7!我希望散列保存原始值 我该怎么做 Perl中的散列值本质上是内存位置吗 是的,但是你不可以直接访问内存。我们将其作为参考。散列的散列实际上是对其他散列的引用的散列。Perl将自动为您创建中间哈希,这是一个称为autovivification的过程 my %hashB; $hashB{a}{c}{d} = 5; print $hashB{a

我有个问题。 如果我将一个散列a的值分配给另一个散列B,然后更改散列B的值,则散列a也会更改。我如何避免这种情况

例如

现在$hashB{a}{b}{c}=7!我希望散列保存原始值

我该怎么做

Perl中的散列值本质上是内存位置吗

是的,但是你不可以直接访问内存。我们将其作为参考。散列的散列实际上是对其他散列的引用的散列。Perl将自动为您创建中间哈希,这是一个称为autovivification的过程

my %hashB;
$hashB{a}{c}{d} = 5;
print $hashB{a}{c}{d};
让我们扩展这个示例,使所有的自动激活都显式化。我将使用简单的字母而不是变量,这样我们就不必定义它们

my %hashB;

# $hashB{a}{c}{d} = 5;
my $hashD = { d => 5 };
my $hashC = { c => $hashD };
$hashB{a} = $hashC;

# print $hashB{a}{c}{d};
$hashC = $hashB{a};
$hashD = $hashC->{c};
print $hashD->{d};
这就是Perl在幕后所做的全部工作。每一层嵌套都有自己的散列

请注意,散列值只是标量,即单个值。如果你试试这个

$hashB{q} = %hashQ;
…你会得到一些非常奇怪的东西。在本例中,Perl尝试将%hashQ视为标量。作为标量的散列是散列中的桶数,类似于1/8。不是很有用

你能做的就是这样

$hashB{q} = \%hashQ;
这会像其他语言中的指针一样引用%hashQ,并将其分配给$hashB{q}

现在,如果您对$hashB{q}中的键进行更改,您实际上将更改%hashQ

另一方面,复制Perl中的简单字符串和数字值。所以在你的例子中

$hashB{$a}{$c}{$d} = 5; # assign 5

$hashA{$a}{$b}{$c}{$d} = $hashB{$a}{$c}{$d}; # COPY 5

$hashA{$a}{$b}{$c}{$d} = 7; # assign 7
$hashB{$a}{$c}{$d}仍然是5,因为它的值5被复制了

另一方面,如果你这样做

$hashB{$a}{$c}{$d} = 5; # assign 5

$hashA{$a}{$b}{$c} = $hashB{$a}{$c}; # copy a reference

$hashA{$a}{$b}{$c}{$d} = 7; # assign 7
现在$hashB{$a}{$c}{$d}是7,因为您复制了对$hashB{$a}{$c}中哈希的引用

有关更多信息,请参阅

Perl中的散列值本质上是内存位置吗

是的,但是你不可以直接访问内存。我们将其作为参考。散列的散列实际上是对其他散列的引用的散列。Perl将自动为您创建中间哈希,这是一个称为autovivification的过程

my %hashB;
$hashB{a}{c}{d} = 5;
print $hashB{a}{c}{d};
让我们扩展这个示例,使所有的自动激活都显式化。我将使用简单的字母而不是变量,这样我们就不必定义它们

my %hashB;

# $hashB{a}{c}{d} = 5;
my $hashD = { d => 5 };
my $hashC = { c => $hashD };
$hashB{a} = $hashC;

# print $hashB{a}{c}{d};
$hashC = $hashB{a};
$hashD = $hashC->{c};
print $hashD->{d};
这就是Perl在幕后所做的全部工作。每一层嵌套都有自己的散列

请注意,散列值只是标量,即单个值。如果你试试这个

$hashB{q} = %hashQ;
…你会得到一些非常奇怪的东西。在本例中,Perl尝试将%hashQ视为标量。作为标量的散列是散列中的桶数,类似于1/8。不是很有用

你能做的就是这样

$hashB{q} = \%hashQ;
这会像其他语言中的指针一样引用%hashQ,并将其分配给$hashB{q}

现在,如果您对$hashB{q}中的键进行更改,您实际上将更改%hashQ

另一方面,复制Perl中的简单字符串和数字值。所以在你的例子中

$hashB{$a}{$c}{$d} = 5; # assign 5

$hashA{$a}{$b}{$c}{$d} = $hashB{$a}{$c}{$d}; # COPY 5

$hashA{$a}{$b}{$c}{$d} = 7; # assign 7
$hashB{$a}{$c}{$d}仍然是5,因为它的值5被复制了

另一方面,如果你这样做

$hashB{$a}{$c}{$d} = 5; # assign 5

$hashA{$a}{$b}{$c} = $hashB{$a}{$c}; # copy a reference

$hashA{$a}{$b}{$c}{$d} = 7; # assign 7
现在$hashB{$a}{$c}{$d}是7,因为您复制了对$hashB{$a}{$c}中哈希的引用

有关更多信息,请参阅


如果你所说的散列值是指引用:是的。相关:你错了$hashA{$a}{$b}{$c}{$d}包含5个$hashA{$a}{$b}{$c}{$d}=$hashB{$a}{$c}{$d}只复制值5,不复制引用。试着写一篇文章来展示意想不到的行为。谢谢大家。我觉得我对散列太过敏感了。若你们所说的散列值是指引用:是的。相关:你们错了$hashA{$a}{$b}{$c}{$d}包含5个$hashA{$a}{$b}{$c}{$d}=$hashB{$a}{$c}{$d}只复制值5,不复制引用。试着写一篇文章来展示意想不到的行为。谢谢大家。我觉得我对散列太敏感了。如果这需要对%hashQ的引用,就像其他语言中的指针一样,引用只是一个不能修改的指针。有些语言有一种,有些有另一种,有些有both@ikegami不能在它所指向的内存上随意涂鸦,但Perl引用可以做更多的事情。通过引用计数进行内存管理。各种各样的旗帜。尺寸和长度跟踪。魔术等对于C程序员来说,Perl引用更好地描述为指向完全内存管理和封装结构的指针。让我们来看看。我认为更准确的说法是:不能修改,因为不能在它指向的内存上随意涂鸦。禁止指针允许Perl跟踪正在使用的内存,并在不再使用时自动释放内存。这一切都是在获取引用并删除它们时在幕后完成的。这获取对%hashQ的引用,就像其他语言中的指针一样,引用只是一个无法修改的指针。有些语言有一种,有些有另一种,有些有both@ikegami不能修改,因为您不能在它指向的内存上随意涂鸦,但是Perl Reference
他们做的更多。通过引用计数进行内存管理。各种各样的旗帜。尺寸和长度跟踪。魔术等对于C程序员来说,Perl引用更好地描述为指向完全内存管理和封装结构的指针。让我们来看看。我认为更准确的说法是:不能修改,因为不能在它指向的内存上随意涂鸦。禁止指针允许Perl跟踪正在使用的内存,并在不再使用时自动释放内存。这一切都是在获取引用并删除它们时在幕后完成的