我有一个索引密钥名为0-2的%parallel_hash:
%parallel_hash
(function_name_0 => "sharp_mpi_steps::run_mpirun",
params_name_0 => ("reporter","xml_obj",$hash{value}),
function_name_1 => "sharp_mpi_steps::run_mpirun",
params_name_1 => ("reporter","xml_obj",$hash{value}),
(function_name_2 => "sharp_mpi_steps::run_mpirun",
params_name_2 => ("reporter","xml_obj",$hash{value})我想用索引文本更新$hash{value}内容。在每个$hash{ params_name_$i }中添加另一个键和值: reporter_message => "process_$i“
我的代码是:
package delete;
use strict;
use warnings FATAL => 'all';
my %parallel_hash;
my %hash_mpi;
$hash_mpi{value}->{bind_to} = "none";
for (my $i=0;$i<=2;$i++)
{
my %hash;
$hash{value} = $hash_mpi{value};
$parallel_hash{"function_name_$i"} = "sharp_mpi_steps::run_mpirun";
@{$parallel_hash{"params_name_$i"}} = ("reporter","xml_obj",$hash{value});
$parallel_hash{"params_name_$i"}->[2]->{reporter_message} = "process_$i";
}
print ("Done");
1;我想得到:
%parallel_hash
'function_name_0' = "sharp_mpi_steps::run_mpirun"
'params_name_0' =
[0] = "reporter"
[1] = "xml_obj"
[2] =
'bind_to' = "none"
'reporter_message" = "process_0"
'function_name_1' = "sharp_mpi_steps::run_mpirun"
'params_name_1' =
[0] = "reporter"
[1] = "xml_obj"
[2] =
'bind_to' = "none"
'reporter_message" = "process_1"
'function_name_2' = "sharp_mpi_steps::run_mpirun"
'params_name_2' =
[0] = "reporter"
[1] = "xml_obj"
[2] =
'bind_to' = "none"
'reporter_message" = "process_2"问题是,在添加"reporter_message“键之后,它还更新了以前的所有"params_name_$i”:
%parallel_hash
'function_name_0' = "sharp_mpi_steps::run_mpirun"
'params_name_0' =
[0] = "reporter"
[1] = "xml_obj"
[2] =
'bind_to' = "none"
'reporter_message" = "process_2"
'function_name_1' = "sharp_mpi_steps::run_mpirun"
'params_name_1' =
[0] = "reporter"
[1] = "xml_obj"
[2] =
'bind_to' = "none"
'reporter_message" = "process_2"
'function_name_2' = "sharp_mpi_steps::run_mpirun"
'params_name_2' =
[0] = "reporter"
[1] = "xml_obj"
[2] =
'bind_to' = "none"
'reporter_message" = "process_2"如何避免这种更新?
发布于 2022-06-06 04:02:16
my %hash_mpi;
$hash_mpi{value}->{bind_to} = "none";
my %hash;
$hash{value} = $hash_mpi{value};
@{$parallel_hash{"params_name_$i"}} = ("reporter","xml_obj",$hash{value});是一种奇怪的做法
my $value = { bind_to => "none" };
$parallel_hash{ "params_name_$i" } = [ "reporter", "xml_obj", $value ];您正在向每个数组中添加一个对相同哈希的引用。
你想要的
my %parallel_hash;
for my $i ( 0 .. 2 ) {
$parallel_hash{ "function_name_$i" } = "sharp_mpi_steps::run_mpirun";
my %hash = ( # Create a new hash.
bind_to => "none",
reporter_message => "process_$i",
);
$parallel_hash{ "params_name_$i" } = [
"reporter",
"xml_obj",
\%hash, # Create a reference to that hash.
];
}{}同时做了这两件事。
my %parallel_hash;
for my $i ( 0 .. 2 ) {
$parallel_hash{ "function_name_$i" } = "sharp_mpi_steps::run_mpirun";
$parallel_hash{ "params_name_$i" } = [
"reporter",
"xml_obj",
{
bind_to => "none",
reporter_message => "process_$i",
}
];
}顺便说一句,这是一个非常奇怪的数据结构。使用数组会更有意义。
my @data;
for my $i ( 0 .. 2 ) {
push @data, {
function => "sharp_mpi_steps::run_mpirun",
params => [
"reporter",
"xml_obj",
{
bind_to => "none",
reporter_message => "process_$i",
}
],
};
}https://stackoverflow.com/questions/72511020
复制相似问题