全局 perl 哈希引用赋值
Global perl hash reference asignment
我有一个全局 perl 散列,我从我的本地引用中为其分配值,我不确定它是否复制到全局散列或使用相同的引用,但那应该是本地内存到街区。
#!/usr/bin/env perl
use strict;
use warnings;
my $hash;
foreach $a (1..10) {
my $localref = {"test"=> 1};
$hash->[$a] = $localref; # does this result in copy?
}
$hash
实际上是一个数组引用,而不是散列引用,不,你分配给 aref 的元素 ($localref
) 不是一个副本,因为它本身是一个参考。要使其成为副本,您必须在插入之前取消引用:%{ $array->[$a] } = %$localref;
我假设这应该是全局哈希引用:
my $hash;
循环从 1 到 10 创建本地作用域哈希引用 $localref:
foreach $a (1..10) {
my $localref = {"test"=> 1};
$localref 现在是指向包含 {test => 1}
的 hashref 的内存地址的指针。试试加个print
命令看看:
print $localref;
您会注意到显示的内存地址在每个循环中都会发生变化 运行。
$hash->[$a] = $localref; # does this result in copy?
}
$hash->[$a]
使用名为 $hash 的变量作为 ArrayRef。你应该考虑重命名它。
尝试在循环后显示 "global" $hash 的内容:
for (1..10) {
print $_."\t".$hash->[$_];
}
您会看到您所有的参考资料仍然有效。
使用Data::Dumper显示内容:
use Data::Dumper;
print Dumper($hash);
最终结论:
存储您的 HashRefs 的内存位置始终保持不变,内容永远不会被复制,但引用(地址信息)被复制。 $hash->[$a] = $localref;
和 }
.
之间的短时间内存在对同一位置的两个引用
PS: {"test"=> 1}
使用的内存将在不再存在对它的引用时立即释放。
我有一个全局 perl 散列,我从我的本地引用中为其分配值,我不确定它是否复制到全局散列或使用相同的引用,但那应该是本地内存到街区。
#!/usr/bin/env perl
use strict;
use warnings;
my $hash;
foreach $a (1..10) {
my $localref = {"test"=> 1};
$hash->[$a] = $localref; # does this result in copy?
}
$hash
实际上是一个数组引用,而不是散列引用,不,你分配给 aref 的元素 ($localref
) 不是一个副本,因为它本身是一个参考。要使其成为副本,您必须在插入之前取消引用:%{ $array->[$a] } = %$localref;
我假设这应该是全局哈希引用:
my $hash;
循环从 1 到 10 创建本地作用域哈希引用 $localref:
foreach $a (1..10) {
my $localref = {"test"=> 1};
$localref 现在是指向包含 {test => 1}
的 hashref 的内存地址的指针。试试加个print
命令看看:
print $localref;
您会注意到显示的内存地址在每个循环中都会发生变化 运行。
$hash->[$a] = $localref; # does this result in copy?
}
$hash->[$a]
使用名为 $hash 的变量作为 ArrayRef。你应该考虑重命名它。
尝试在循环后显示 "global" $hash 的内容:
for (1..10) {
print $_."\t".$hash->[$_];
}
您会看到您所有的参考资料仍然有效。
使用Data::Dumper显示内容:
use Data::Dumper;
print Dumper($hash);
最终结论:
存储您的 HashRefs 的内存位置始终保持不变,内容永远不会被复制,但引用(地址信息)被复制。 $hash->[$a] = $localref;
和 }
.
PS: {"test"=> 1}
使用的内存将在不再存在对它的引用时立即释放。