我有一个哈希的数组哈希。哈希的关键是$duration
和$attr
。我想对降序$b <=> $a
进行排序,并仅删除那些具有相同持续时间的重复值。在片段中,这些应该是流:
'h264/AVC, 1080p24 /1.001 (16:9)' & 'AC3, English, multi-channel, 48kHz'
持续时间'26'
但不包含$ duration '2124'
&amp;的重复值'115'
。
有无数的删除重复项的例子,我已经尝试了一切我能找到的东西来满足我的需求,但没有成功。我的解决方案应该是什么?感谢。
my ( %recordings_by_dur_attr ) = ();
push( @{ $recordings_by_dur_attr{ $duration }{ $attr } }, @stream );
print Data::Dumper->Dump( [\%recordings_by_dur_attr] );
结果:
$VAR1 = {
'2124' => {
'00300.mpls, 00-35-24' => [
'',
'h264/AVC, 480i60 /1.001 (16:9)',
'AC3, English, stereo, 48kHz'
]
},
'50' => {
00021.mpls, 00-00-50' => [
'',
'h264/AVC, 1080p24 /1.001 (16:9)',
'AC3, English, multi-channel, 48kHz'
]
},
'6528' => {
'00800.mpls, 01-48-48' => [
'',
'Chapters, 18 chapters',
'h264/AVC, 1080p24 /1.001 (16:9)',
'DTS, Japanese, stereo, 48kHz',
'DTS Master Audio, English, stereo, 48kHz',
'DTS, French, stereo, 48kHz',
'DTS, Italian, stereo, 48kHz',
'DTS, German, stereo, 48kHz',
'DTS, Spanish, stereo, 48kHz',
'DTS, Portuguese, stereo, 48kHz',
'DTS, Spanish, stereo, 48kHz',
'DTS, Russian, stereo, 48kHz'
]
},
'26' => {
'01103.mpls, 00-00-26' => [
'',
'h264/AVC, 1080p24 /1.001 (16:9)',
'AC3, English, multi-channel, 48kHz'
],
'01102.mpls, 00-00-26' => [
'',
'h264/AVC, 1080p24 /1.001 (16:9)',
'AC3, English, multi-channel, 48kHz'
],
'00011.mpls, 00-00-26' => [
'',
'h264/AVC, 1080p24 /1.001 (16:9)',
'AC3, English, multi-channel, 48kHz'
]
},
'115' => {
'00304.mpls, 00-01-55' => [
'',
'h264/AVC, 480i60 /1.001 (16:9)',
'AC3, English, stereo, 48kHz'
]
}
};
重复结构
'',
'h264/AVC, 1080p24 /1.001 (16:9)',
'AC3, English, multi-channel, 48kHz'
删除重复结构的结果:
$VAR1 = {
'2124' => {
'00300.mpls, 00-35-24' => [
'',
'h264/AVC, 480i60 /1.001 (16:9)',
'AC3, English, stereo, 48kHz'
]
},
'50' => {
00021.mpls, 00-00-50' => [
'',
'h264/AVC, 1080p24 /1.001 (16:9)',
'AC3, English, multi-channel, 48kHz'
]
},
'6528' => {
'00800.mpls, 01-48-48' => [
'',
'Chapters, 18 chapters',
'h264/AVC, 1080p24 /1.001 (16:9)',
'DTS, Japanese, stereo, 48kHz',
'DTS Master Audio, English, stereo, 48kHz',
'DTS, French, stereo, 48kHz',
'DTS, Italian, stereo, 48kHz',
'DTS, German, stereo, 48kHz',
'DTS, Spanish, stereo, 48kHz',
'DTS, Portuguese, stereo, 48kHz',
'DTS, Spanish, stereo, 48kHz',
'DTS, Russian, stereo, 48kHz'
]
},
'26' => {
'00011.mpls, 00-00-26' => [
'',
'h264/AVC, 1080p24 /1.001 (16:9)',
'AC3, English, multi-channel, 48kHz'
]
},
'115' => {
'00304.mpls, 00-01-55' => [
'',
'h264/AVC, 480i60 /1.001 (16:9)',
'AC3, English, stereo, 48kHz'
]
}
};
后期处理
for my $duration ( sort { $b <=> $a } keys %recordings_by_dur_attr ) {
for my $attr ( keys $recordings_by_dur_attr{ $duration } ) {
#Remove duplicate structures
my @stream = @{ $recordings_by_dur_attr{ $duration }{ $attr } };
my ( $mpls, $hms ) = ( $attr =~ /(\d+\.mpls), (\d+-\d+-\d+)$/ );
for ( my $i = 1; $i < @stream; $i++ ) {
#extract info from each stream
}
}
}
答案 0 :(得分:1)
表达式$seen{$candidate}++
对于查找重复项非常有用。当它返回true时,先前已经看到$candidate
。最常用的如下:
my @uniq = grep !$seen{$_}++, @list;
我没有构建要保留的元素键列表,而是将条件反转为构建要删除的元素键列表。
sub id { pack 'N/(N/a*)', @{ $_[0] } }
for my $recordings_by_attr (values(%recordings_by_dur_attr)) {
my %seen;
delete @{$recordings_by_attr}{
grep $seen{id($recordings_by_attr->{$_})}++,
sort
keys %$recordings_by_attr
};
}
sort
决定删除哪个重复项。如果您不关心哪个,可以删除sort
。
答案 1 :(得分:0)
步骤:
1. Traverse the hash.
2. if ref $key eq "ARRAY"
then
1. my `@temp = uniq(@{$hash->{$key}})`;
2. $var = undef;
3. $var = \@temp;
Else
1. Traverse the hash.
3. Else
1. next;