0

假设你有:

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';
    }

这该怎么做?

4

2 回答 2

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并访问其中的哈希值。由于我们仍在使用引用,因此我们“就地”编辑它们。

于 2013-08-22T09:38:03.600 回答
2

那么你可以使用地图

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

但它也是一个循环。

于 2013-08-22T09:42:04.413 回答