首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用for循环单独更新哈希索引键

使用for循环单独更新哈希索引键
EN

Stack Overflow用户
提问于 2022-06-05 20:49:46
回答 1查看 53关注 0票数 1

我有一个索引密钥名为0-2的%parallel_hash:

代码语言:javascript
复制
%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“

我的代码是:

代码语言:javascript
复制
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;

我想得到:

代码语言:javascript
复制
%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”:

代码语言:javascript
复制
%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"

如何避免这种更新?

EN

回答 1

Stack Overflow用户

发布于 2022-06-06 04:02:16

代码语言:javascript
复制
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});

是一种奇怪的做法

代码语言:javascript
复制
my $value = { bind_to => "none" };

$parallel_hash{ "params_name_$i" } = [ "reporter", "xml_obj", $value ];

您正在向每个数组中添加一个对相同哈希的引用。

你想要的

代码语言:javascript
复制
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.
    ];
}

{}同时做了这两件事。

代码语言:javascript
复制
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",
       }
    ];
}

顺便说一句,这是一个非常奇怪的数据结构。使用数组会更有意义。

代码语言:javascript
复制
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",
          }
       ],
    };
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72511020

复制
相关文章

相似问题

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