从perl中的哈希中删除多个值

时间:2014-05-30 05:47:23

标签: perl

我需要在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操作并从循环中执行。有什么想法吗?

1 个答案:

答案 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来获取所有密钥。