Perl 如何从一个散列中获取值,并使用另一个散列中的键

Perl how can I get values from a hash with key from another hash

我有两个散列,第一个 %hash 包含唯一键和值。

另一个 %channel 仅包含商店,这些商店已经作为 %hash

的值存在

我想显示所有类别 ID (例如 Category::1375567 等) 指的是商店 (例如 Store::CAR)

下面是我需要的预期结果,会比我的解释更有效率

my %hash = (
        'Category::1375567' => 'Store::CAR|Category::1375567|CAR Concert',
        'Category::1299556' => 'Store::CHANNEL|Category::1299556|Culture',
        'Category::1314571' => 'Store::TV|Category::1314571|Emissions',
        'Category::1375568' => 'Store::CAR|Category::1375568|Sciences',
        'Category::1314570' => 'Store::TV|Category::1314570|Info',
        'Category::1314572' => 'Store::TV|Category::1314572|Jeunesse',
        'Category::1314569' => 'Store::TV|Category::1314569|Séries & Fictions',
        'Category::1294556' => 'Store::CHANNEL|Category::1294556|Documentaire',
        'Category::1326557' => 'Store::CHANNEL|Category::1326557|Sport'
);

my %channel = (
        'Store::TV' => 'Store::TV',
        'Store::CAR' => 'Store::CAR',
        'Store::CHANNEL' => 'Store::CHANNEL'
);

预期结果

    Store::CAR
Store::CAR|Category::1375567|CAR Concert
Store::CAR|Category::1375568|Sciences

    Store::CHANNEL
Store::CHANNEL|Category::1294556|Documentaire
Store::CHANNEL|Category::1299556|Culture
Store::CHANNEL|Category::1326557|Sport

    Store::TV
Store::TV|Category::1314569|Séries & Fictions
Store::TV|Category::1314570|Info
Store::TV|Category::1314571|Emissions
Store::TV|Category::1314572|Jeunesse

实际结果

    Store::CAR
Store::CAR|Category::1375567|CAR Concert
Store::CAR|Category::1375568|Sciences
Store::CHANNEL|Category::1294556|Documentaire
Store::CHANNEL|Category::1299556|Culture
Store::CHANNEL|Category::1326557|Sport
Store::TV|Category::1314569|Séries & Fictions
Store::TV|Category::1314570|Info
Store::TV|Category::1314571|Emissions
Store::TV|Category::1314572|Jeunesse

    Store::CHANNEL
Store::CAR|Category::1375567|CAR Concert
Store::CAR|Category::1375568|Sciences
Store::CHANNEL|Category::1294556|Documentaire
Store::CHANNEL|Category::1299556|Culture
Store::CHANNEL|Category::1326557|Sport
Store::TV|Category::1314569|Séries & Fictions
Store::TV|Category::1314570|Info
Store::TV|Category::1314571|Emissions
Store::TV|Category::1314572|Jeunesse

这是我到目前为止所做的

#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;
use feature 'say';

my %hash = (
        'Category::1375567' => 'Store::CAR|Category::1375567|CAR Concert',
        'Category::1299556' => 'Store::CHANNEL|Category::1299556|Culture',
        'Category::1314571' => 'Store::TV|Category::1314571|Emissions',
        'Category::1375568' => 'Store::CAR|Category::1375568|Sciences',
        'Category::1314570' => 'Store::TV|Category::1314570|Info',
        'Category::1314572' => 'Store::TV|Category::1314572|Jeunesse',
        'Category::1314569' => 'Store::TV|Category::1314569|Séries & Fictions',
        'Category::1294556' => 'Store::CHANNEL|Category::1294556|Documentaire',
        'Category::1326557' => 'Store::CHANNEL|Category::1326557|Sport'
);


my %channel = (
        'Store::TV' => 'Store::TV',
        'Store::CAR' => 'Store::CAR',
        'Store::CHANNEL' => 'Store::CHANNEL'
);

if (%channel) {
        foreach (sort keys %channel) {
                say "\t", $_;
                my @tab = grep{/'$_'/} sort values %hash;
                if (@tab) {
                        foreach my $line (@tab) {
                                say $line;
                        }
                        say "";
                }
        }
}

#say Dumper(\%hash, \%channel);

__END__

您可以删除一些冗余以使散列更小。

此外,添加 utf8 as the script contains the character é; to get it printed correctly, add open

转换第一个散列,以便按公共值键入值。由于每个转换后的键有多个值,因此使用数组散列。

#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };

use utf8;
use open OUT => ':encoding(UTF-8)', ':std';

my %hash = (
        '1375567' => 'Store::CAR|CAR Concert',
        '1299556' => 'Store::CHANNEL|Culture',
        '1314571' => 'Store::TV|Emissions',
        '1375568' => 'Store::CAR|Sciences',
        '1314570' => 'Store::TV|Info',
        '1314572' => 'Store::TV|Jeunesse',
        '1314569' => 'Store::TV|Séries & Fictions',
        '1294556' => 'Store::CHANNEL|Documentaire',
        '1326557' => 'Store::CHANNEL|Sport'
);

my %channel;
@channel{qw{ Store::TV Store::CAR Store::CHANNEL }} = ();

my %transformed;
for my $category (keys %hash) {
    my ($val1, $val2) = split /\|/, $hash{$category};
    push @{ $transformed{$val1} }, [$category, $val2];
}

for my $ch (sort keys %channel) {
    say ' ' x 4, $ch;
    local $" = '|';
    say "Category::@$_" for sort { $a->[0] <=> $b->[0] } @{ $transformed{$ch} };
    say "";
}

以下演示代码使用 $stores 创建新的哈希引用,其中键为 store id,值从 %hash.

复制

使用散列 %channel 中的键从散列引用输出数据 $stores

#!/usr/bin/env perl

use strict;
use warnings;
use feature 'say';

use utf8;

my $stores;
my %hash = (
        'Category::1375567' => 'Store::CAR|Category::1375567|CAR Concert',
        'Category::1299556' => 'Store::CHANNEL|Category::1299556|Culture',
        'Category::1314571' => 'Store::TV|Category::1314571|Emissions',
        'Category::1375568' => 'Store::CAR|Category::1375568|Sciences',
        'Category::1314570' => 'Store::TV|Category::1314570|Info',
        'Category::1314572' => 'Store::TV|Category::1314572|Jeunesse',
        'Category::1314569' => 'Store::TV|Category::1314569|Séries & Fictions',
        'Category::1294556' => 'Store::CHANNEL|Category::1294556|Documentaire',
        'Category::1326557' => 'Store::CHANNEL|Category::1326557|Sport'
);

my %channel = (
        'Store::TV' => 'Store::TV',
        'Store::CAR' => 'Store::CAR',
        'Store::CHANNEL' => 'Store::CHANNEL'
);

for ( values %hash ) {
        my($id,$cat,$desc) = split /\|/;
        push @{$stores->{$id}}, $_;
}

for my $id ( sort keys %channel ) {
        say ' ' x 4 . $id;
        say $_ for @{$stores->{$id}};
        say '';
}

exit 0;

输出

    Store::CAR
Store::CAR|Category::1375567|CAR Concert
Store::CAR|Category::1375568|Sciences

    Store::CHANNEL
Store::CHANNEL|Category::1294556|Documentaire
Store::CHANNEL|Category::1299556|Culture
Store::CHANNEL|Category::1326557|Sport

    Store::TV
Store::TV|Category::1314569|Séries & Fictions
Store::TV|Category::1314570|Info
Store::TV|Category::1314571|Emissions
Store::TV|Category::1314572|Jeunesse