解析中
データが非常に整然としている場合はsplit
、各行で行うことができます。前にスペースがあるカンマで分割すると、animal-toynum のペアが得られ、等号で分割できます。私はこれを書きます:
my %toys = map {split /=/, $_, 2} split /,\s*/, $line;
興味深い点は、map
関数と 3 番目の引数が 1 つのケースでは分割されるが、別のケースでは分割されないことです。これらの理由は のドキュメントでperldoc -f
あり、ここで行われるリストからハッシュへの強制に由来します。
次に、ハッシュへの参照を取得して、のように配列に詰め込むことができますpush @array, \%toys
。次に、6 行目を解析した場合に$array[5]{mouse}
得られるのような要素にアクセスできます。3
データがより複雑な場合は、正規表現を使用する必要があります。
my %toys;
while (my $line = <>) {
while ($line =~ m{ \G \s* ([\w-]+) =\s* (\d+) (?:,|\s*$) }xgc) {
$toys{$1} += $2;
}
}
これは各行を保存するのではなく、各動物のおもちゃを自動的に合計します。
データ構造
Perl は多次元配列をサポートしていませんが、同じことになる arrayref の配列をサポートしています。
my @AoA = (
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
);
角括弧は無名の配列参照を表し、中括弧は無名のハッシュ参照を表します。perldoc perldata
、perldoc perllol
、perldoc perlreftut
および友人は、これらに関する詳細情報を持っています。