私はperlが初めてです。キーに対応する値を次の方法で保存したいと思います。サンプル入力データについては、以下を参照してください。誰かがこれをperlで行うのを手伝ってくれませんか。
出力:
key value
1 (11, 20)
2 (17, 15)
3 (10, 11)
入力データ:
key value
2 17
3 10
1 11
1 20
2 15
3 11
私はperlが初めてです。キーに対応する値を次の方法で保存したいと思います。サンプル入力データについては、以下を参照してください。誰かがこれをperlで行うのを手伝ってくれませんか。
出力:
key value
1 (11, 20)
2 (17, 15)
3 (10, 11)
入力データ:
key value
2 17
3 10
1 11
1 20
2 15
3 11
配列のハッシュ構造 ( perldoc perldsc )にデータを格納できます。
use warnings;
use strict;
use Data::Dumper;
$Data::Dumper::Sortkeys = 1;
my %data;
while (<DATA>) {
my ($k, $v) = split;
push @{ $data{$k} } , $v;
}
print Dumper(\%data);
=for output
$VAR1 = {
'1' => [
'11',
'20'
],
'2' => [
'17',
'15'
],
'3' => [
'10',
'11'
]
};
=cut
__DATA__
2 17
3 10
1 11
1 20
2 15
3 11
入力データの各行が文字列であると仮定すると、定義により一意のキーを持つハッシュを使用します。
キーがハッシュに存在する場合は、値を配列参照にプッシュします。存在しない場合は、値を持つキーに配列参照を割り当てます。次にそのキーが表示されたら、その値を arrayref にプッシュします。
my $hash = {};
foreach my $line ( @lines ) {
my ($key, $val) = split(/\s/, $line);
if( $hash->{$key} ) {
push( @{ $hash->{ $key } }, $val );
}
else {
$hash->{$key} = [ $val ];
}
}
ワンライナーの使用:
$ echo "key value
2 17
3 10
1 11
1 20
2 15
3 11" | perl -anE'next if 1..1;push@{$h{$F[0]}},$F[1]}{say"key value";$"=", ";say"$_ (@{$h{$_}})"for sort{$a<=>$b}keys%h'
key value
1 (11, 20)
2 (17, 15)
3 (10, 11)