map と $_ を使用して、特定の順序に基づいてリストをソートする方法について説明しました。今日は別の質問があります。
私は同じオーダーバイを持っています:
my @orderby = ( 'car', 'boat', 'chicken', 'cat', 'dog', 'mouse');
# or if it's better to the code:
my %orderby = ( 'car' => 0,
'boat' => 1,
'chicken' => 2,
'cat' => 3,
'dog' => 4,
'mouse' => 5);
そして今、orderbyで注文する必要がある次のものがあります。
print Dumper \%toys;
$VAR = {
'animals' => [
[
'feather', 'cluck-2', 'chicken', 'white'
],
[
'bald', 'bark', 'dog', 'black stripes'
],
[
'feather', 'cluck-2', 'chicken', 'white'
]
],
'notanima' => [
[
'paited', 'motor', 'boat', 'red'
],
[
'painted', 'motor', 'car', 'blue on top'
]
]
};
コードは、orderby に基づいて 3 列を使用して並べ替える必要があります。動物とノタニマには同じ順序を使用する必要があります。再配置後、$VAR は次のようになります。
$VAR = {
'animals' => [
[
'feather', 'cluck-2', 'chicken', 'white'
],
[
'feather', 'cluck-2', 'chicken', 'white'
],
[
'bald', 'bark', 'dog', 'black stripes'
]
],
'notanima' => [
[
'painted', 'motor', 'car', 'blue on top'
],
[
'paited', 'motor', 'boat', 'red'
]
]
};
order %toys{key} by orderby;
@ikegami が提供したマップ ソリューションを変更しようとしました
my %counts; ++$counts{$_} for @list;
my @sorted = map { ($_) x ($counts{$_}||0) } @orderby;
しかし、私は成功しませんでした。どうすればこの目的を達成できるか考えていますか?
事前にthx!
アップデート!
私は池上からの提案を使おうとしていました、私はこれをしました:
# that first foreach will give one ARRAY for animals and one ARRAY for notanima
foreach my $key (keys %toys)
{
# that one will give me access to the ARRAY referenced by the $key.
foreach my $toy_ref ($toys{$key})
{
my %orderby = map {$orderby[$_] => $_} 0..$#orderby;
my @sorted = sort { $orderby{$a} <=> $orderby{$b} } @{$toy_ref};
# my @sorted = sort { $orderby{$a} <=> $orderby{$b} } $toy_ref;
print Dumper @sorted;
}
}
まず、これは私に警告を与えます:
Use of uninitialized value in numeric comparison (<=>) at....
そして、notanima の並べ替えの結果 (動物は無視するので、投稿はそれほど大きくなりません):
$VAR1 = [
'paited', 'motor', 'boat', 'red'
];
$VAR2 = [
'painted', 'motor', 'car', 'blue on top'
];
orderby に基づいて、印刷順序は次のようにする必要があります。
$VAR1 = [
'painted', 'motor', 'car', 'blue on top'
];
$VAR2 = [
'paited', 'motor', 'boat', 'red'
];
車が最初に来る必要があります。私が間違ったことをしましたか?