Perl:更改动态数组引用的值

时间:2013-08-22 09:29:38

标签: perl

假设你有:

my $data1 = [
  +{ id => 1, name => 'A' },
  +{ id => 2, name => 'B' },
  +{ id => 3, name => 'C' },
  +{ id => 4, name => 'A' },
  # .... many rows
];

作为输入。

我希望每次名称为'A'(名称=>'A')时将ID更改为1(id => 1)。循环是否完全必要?

    #  loop

    if ( $data1->[#what to put here?]->{id} = 1 ) {
        $data1->[#what to put here?]->{name} = 'A';
    }

怎么做?

2 个答案:

答案 0 :(得分:2)

以下是如何循环数据结构的示例。我用Data::Dumper来研究它们。它应该清楚它的结构。

#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

my $data1 = [{ id => 1, name => 'A' },{ id => 2, name => 'B' },{ id => 3, name => 'C' },{ id => 4, name => 'A' },];

print "Before: \n" . Data::Dumper->Dump($data1)."\n\n";

foreach (@$data1){
    if ($_->{name} eq 'A'){
        $_->{id} = 1;
    }
}

print "After: \n" . Data::Dumper->Dump($data1)."\n";

您的$data1是一个数组引用。它被解除引用(@$data1),因此我们可以使用foreach遍历它并访问其中的哈希值。当我们仍在使用引用时,我们会“就地”编辑它们。

答案 1 :(得分:2)

你可以使用地图

map {$_->{id} = 1 if $_->{name} eq 'A'} @$data1;

但它也是一个循环。