我需要在perl中遍历散列,然后如果对于一个键,以数组的形式存在多个值,则取第一个值。我的代码片段是
while (my ($key, $value) = each(%ARGS)) {
print "$key-----------------------------$value\n\n";
if ($key =~ /submit\.([\w-]+)/) {
$submitField = $1;
} elsif ($key =~ /action/) {
$submitField = $value;
}
if (ref($value) ) {
if (%min_args)
{
print ("min args not found aborting the request");
$m->comp('/x-locale/errors/404.m');
$m->abort();
}
print "multiple value found for $key";
$value = shift @$value if ref($value) eq "ARRAY";
$ARGS{$key} = $value;
print "value changed $ARGS{$key}\n\n";
print Data::Dumper->Dump([$value]);
print "<pre>" . Data::Dumper->Dump([%ARGS]) . "</pre>";
}
}
问题在于,如果我传入多个具有值数组的键,则它仅对第一个键执行shift操作并从循环中执行。有什么想法吗?
答案 0 :(得分:1)
你没有表现出问题,并且添加了缺失的位,我们得到了预期的结果。
use strict;
use warnings;
use Data::Dumper;
my %ARGS = (
a => 'b',
c => [ 'd', 'e' ],
f => [ 'g', 'h' ],
i => 'j',
);
while (my ($key, $value) = each(%ARGS)) {
# print "$key-----------------------------$value\n\n";
# if ($key =~ /submit\.([\w-]+)/) {
# $submitField = $1;
# } elsif ($key =~ /action/) {
# $submitField = $value;
# }
if (ref($value) ) {
# if (%min_args) {
# print ("min args not found aborting the request");
# $m->comp('/x-locale/errors/404.m');
# $m->abort();
# }
# print "multiple value found for $key";
$value = shift @$value if ref($value) eq "ARRAY";
$ARGS{$key} = $value;
# print "value changed $ARGS{$key}\n\n";
# print Data::Dumper->Dump([$value]);
# print "<pre>" . Data::Dumper->Dump([%ARGS]) . "</pre>";
Data::Dumper->Dump([%ARGS]);
}
}
print Dumper(\%ARGS);
输出:
$VAR1 = {
'c' => 'd',
'a' => 'b',
'f' => 'g',
'i' => 'j'
};
请注意,有一些时髦的东西正在发生。每个哈希只有一个迭代器,因此循环内的Data :: Dumper调用只能看到部分哈希值。它还会重置迭代器,导致each
重新启动。为避免重复访问相同的密钥,请将调用移到循环外部的Data :: Dumper(应该在的位置)或使用for keys
而不是while each
来获取所有密钥。