Perl哈希和计数
我正在尝试处理使用data::Dumper输出的perl数据结构Perl哈希和计数,perl,hash,counting,Perl,Hash,Counting,我正在尝试处理使用data::Dumper输出的perl数据结构 $VAR1 = 'GAHD'; $VAR2 = [ { 'COUNTRY' => 'US', 'NAME' => 'K. Long', 'DATE_OF_BIRTH' => '7/27/1957', 'POSITION' => 'SENIOR OFFICER', 'AGE'
$VAR1 = 'GAHD';
$VAR2 = [
{ 'COUNTRY' => 'US',
'NAME' => 'K. Long',
'DATE_OF_BIRTH' => '7/27/1957',
'POSITION' => 'SENIOR OFFICER',
'AGE' => 57,
'GRADE' => 'P5'
},
{ 'COUNTRY' => 'US',
'NAME' => 'J. Buber',
'DATE_OF_BIRTH' => '12/11/1957',
'POSITION' => 'CHIEF',
'GRADE' => 'D1'
},
{ 'COUNTRY' => 'US',
'NAME' => 'M. Amsi',
'DATE_OF_BIRTH' => '1/1/1957',
'POSITION' => 'SENIOR ANIMAL HEALTH OFFICER',
'AGE' => 57,
'GRADE' => 'P5'
},
{ 'COUNTRY' => 'US',
'NAME' => 'E. Xenu',
'DATE_OF_BIRTH' => '8/31/1964',
'POSITION' => 'SENIOR OFFICER',
'AGE' => 50,
'GRADE' => 'P5'
},
];
$VAR3 = 'GAGD';
$VAR4 = [
{ 'COUNTRY' => 'US',
'NAME' => 'P. Cheru',
'DATE_OF_BIRTH' => '6/18/1966',
'POSITION' => 'ANIMAL PRODUCTION OFFICER',
'AGE' => 48,
'GRADE' => 'P4'
},
{ 'COUNTRY' => 'US',
'NAME' => 'B. Burns',
'DATE_OF_BIRTH' => '2/4/1962',
'POSITION' => 'ANIMAL PRODUCTION OFFICER',
'AGE' => 52,
'GRADE' => 'P4'
},
{ 'COUNTRY' => 'US',
'NAME' => 'R. Mung',
'DATE_OF_BIRTH' => '12/13/1968',
'POSITION' => 'ANIMAL PRODUCTION OFFICER',
'AGE' => 45,
'GRADE' => 'P4'
},
{ 'COUNTRY' => 'GERMANY',
'NAME' => 'B. Scherf',
'DATE_OF_BIRTH' => '8/31/1964',
'POSITION' => 'ANIMAL PRODUCTION OFFICER',
'AGE' => 50,
'GRADE' => 'P4'
},
{ 'COUNTRY' => 'GERMANY',
'NAME' => 'I. Hoffmann',
'DATE_OF_BIRTH' => '2/21/1960',
'POSITION' => 'CHIEF',
'AGE' => 54,
'GRADE' => 'P5'
},
];
输出以下内容:
1 ADG初级军官K.King
1 DG高级董事K.King
3 P5高级官员R.Forest
R.森林
K.金
1 P3初级军官K.King
3 P1林业官员P.史密斯
特纳
特纳
1 P1总干事K.King
我想按部门统计等级
和职位
的数量。以下是我迄今为止编写的代码:
#Push data read from a flat file and while loop
push @{ $grades{ $_->{GRADE} }{ $_->{POSITION} } }, $_->{NAME} for @$AG;
for my $key (
sort { substr( $a, 0, 1 ) cmp substr( $b, 0, 1 ) || substr( $b, 0, 2 ) cmp substr( $a, 0, 2 ) }
keys %grades
)
{
for my $pos ( sort { $a cmp $b } keys %{ $grades{$key} } ) {
my $names = $grades{$key}->{$pos};
my $count = scalar @$names;
print $count, ' ', $key, ' ', $pos, ' ', $names->[0], "\n";
print ' ', $names->[$_], "\n" for 1 .. $#$names;
}
}
如果在另一个部门出现重复的职位和职系数据(即P1,高级官员),代码将停止输出结果
我不知道如何按分区(即GAGD、GAGHD等)访问哈希值,以便每个分区输出相同的等级和位置
以下是我真正需要的:
**GAGD**
1名ADG初级军官K.King
1 DG高级董事K.King
3 P5高级官员R.Forest
R.森林
K.金
1 P3初级军官K.King
3 P1林业官员P.史密斯
特纳
特纳
1 P1总干事K.King
**GAGHD**
1 P3初级军官P.格林
3 P1林业官员R.布朗
F.布
K.教堂
1 P1总干事D.Peefer
等
等
你的代码就快到了。假设您打印出来的散列名为%grades
,我将执行以下操作:
foreach my $g (sort keys %$grades) {
print "**$g**\n";
# put the info to be printed in a temporary hash
my %temp;
foreach (@{$grades->{$g}}) {
push @{$temp{ $_->{GRADE}." ".$_->{POSITION} }}, $_->{NAME};
}
foreach (sort keys %temp) {
# print a count of the number of names, then the grade/position info
print scalar @{$temp{$_}} . " $_ "
# @{$temp{$_}} holds the names, so just sort them and print them out.
. join("\n\t\t\t", sort @{$temp{$_}}) . "\n";
}
}
似乎您希望按除法散列信息,然后按等级+位置计数和存储名称。以下几点似乎对我有用:
#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };
my %grades = (
GAHD => [ {
NAME => 'K. Long',
POSITION => 'SENIOR OFFICER',
GRADE => 'P5'
},
{
NAME => 'J. Buber',
POSITION => 'CHIEF',
GRADE => 'D1'
},
{
NAME => 'M. Amsi',
POSITION => 'SENIOR ANIMAL HEALTH OFFICER',
GRADE => 'P5'
},
{
NAME => 'E. Xenu',
POSITION => 'SENIOR OFFICER',
GRADE => 'P5'
},
],
GAGD => [
{
NAME => 'P. Cheru',
POSITION => 'ANIMAL PRODUCTION OFFICER',
GRADE => 'P4'
},
{
NAME => 'B. Burns',
POSITION => 'ANIMAL PRODUCTION OFFICER',
GRADE => 'P4'
},
{
NAME => 'R. Mung',
POSITION => 'ANIMAL PRODUCTION OFFICER',
GRADE => 'P4'
},
{
NAME => 'B. Scherf',
POSITION => 'ANIMAL PRODUCTION OFFICER',
GRADE => 'P4'
},
{
NAME => 'I. Hoffmann',
POSITION => 'CHIEF',
GRADE => 'P5'
},
]);
for my $division (keys %grades) {
say "**$division**";
my %group;
for my $person (@{ $grades{$division} }) {
my $position = join ' ', @{ $person }{qw{GRADE POSITION}};
push @{ $group{$position} }, $person->{NAME};
}
for my $position (keys %group) {
say join ' ', scalar @{ $group{$position} },
$position,
$group{$position}[0];
my @remaining_names = @{ $group{$position} };
shift @remaining_names;
say "\t$_" for @remaining_names;
}
say q();
}
更新
如果在数组ref(push-push@{$group{$position},[…];
)中存储的信息多于一个人的姓名,则可以通过取消引用每个引用来检索它,例如在map
中:
say join ' ', scalar @{ $group{$position} },
$position,
join "\n\t", map "@$_", @{ $group{$position} };
弄清楚你的输入是什么,你的预期输出应该是什么,你得到的实际输出是什么,可能会有所帮助。这个问题很清楚,但仍然非常模糊。在你的“你真正需要什么”结果中,
GAGHD
来自哪里?这是一个打字错误吗?@PerlGui perlmonks解决了你的问题还是你还在思考?计数可以来自$count{$position}{names}
@剩余的\u名称
中的名称数也不是真的需要。。。(我正在慢慢地把你的代码转换成我的…)我不知道该如何感谢你。最后一件事,我如何从数据结构{NAME=>'I GREEN',POSITION=>'CHIEF',GRADE=>'P5',COUNTRY=>'US',AGE=>'45',}中调用并打印其他字段,如COUNTRY,AGE等?我真的需要输出的不仅仅是姓名、等级和职位@PerlGui:推送
你需要打印的所有内容,然后打印出来。@Choroba,如果我按你的建议推送数据(即推送{$group{$position}、$person->{NAME}、$person->{COUNTRY}、$person->{DATE OF(出生日期}、$person->{AGE}、$person->{FEMALE}、$person->空置};),计数器将不再按预期工作。D1首席T.Roth美利坚合众国1937年11月12日56 21 P5高级军官K.Logh英国1957年7月27日57*我做错了什么?