假设你有:
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';
}
怎么做?
答案 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;
但它也是一个循环。