我有兩個散列,第一個 %hash 包含 uniq 鍵和值。
另一個 %channel 僅包含已作為 %hash 值存在的商店
我想顯示參考商店(例如 Store::CAR)的所有類別 ID (例如 Category::1375567 等)
在我需要的預期結果之下,它將比我的解釋更有效。
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__
uj5u.com熱心網友回復:
您可以洗掉一些冗余以使散列更小。
另外,添加utf8因為腳本包含字符é; 要正確列印,請添加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 "";
}
uj5u.com熱心網友回復:
以下演示代碼創建了新的哈希參考,$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
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/409712.html
標籤:
下一篇:從哈希內的陣列中洗掉值
