/ / Comment supprimer les valeurs en double du hachage de tableaux avec 2 références - Perl

Comment supprimer les valeurs en double du hachage de tableaux comportant 2 références - perl

J'ai un hachage de hachage de tableaux. Les clés des hachages sont $duration et $attr. Je veux trier par ordre décroissant $b <=> $a et supprimez uniquement les valeurs en double, qui ont une durée égale. Dans l'extrait de code, il doit s'agir de flux:

"h264/AVC, 1080p24 /1.001 (16:9)" & "AC3, English, multi-channel, 48kHz" avec durée "26" mais pas les valeurs en double avec $ duration "2124" Et "115".

Il existe d'innombrables exemples pour supprimer les doublons et j'ai essayé tout ce que je pouvais trouver pour mettre en œuvre pour mes besoins, mais sans succès. Quelle devrait être mon approche pour la solution. Merci.

my ( %recordings_by_dur_attr ) = ();

push( @{ $recordings_by_dur_attr{ $duration }{ $attr } }, @stream );

print Data::Dumper->Dump( [%recordings_by_dur_attr] );

Résultat:

$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"
]
}
};

Structure en double

 "",
"h264/AVC, 1080p24 /1.001 (16:9)",
"AC3, English, multi-channel, 48kHz"

Résultat souhaité avec structure dupliquée supprimée:

$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"
]
}
};

Post-traitement

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

}
}
}

Réponses:

1 pour la réponse № 1

L'expression $seen{$candidate}++ est utile pour trouver des doublons. Quand il revient vrai, $candidate a déjà été vu. Il est le plus souvent utilisé comme suit:

my @uniq = grep !$seen{$_}++, @list;

Au lieu de construire une liste de clés d'éléments à conserver, j'ai inversé la condition pour construire une liste de clés d'éléments à supprimer.

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
};
}

le sort décide lequel des doublons supprimer. Si vous ne vous en souciez pas, vous pouvez supprimer le sort.


0 pour la réponse № 2

Pas:

    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;