解析
如果数据很有序,可以split
放在每一行。如果我们用逗号分隔前面的空格,我们将得到动物-toynum 对,然后我们可以在等号上进行分割。我会这样写:
my %toys = map {split /=/, $_, 2} split /,\s*/, $line;
有趣的位是map
在一种情况下要拆分的函数和第三个参数,但在另一种情况下则不然。这些原因是 documentet in perldoc -f
,并且源于此处发生的 list-to-hash 强制。
然后,您可以引用哈希并将其填充到数组中,例如push @array, \%toys
. 然后,您可以访问类似 的元素,如果我们只解析第六行$array[5]{mouse}
就会给出。3
如果数据更复杂,则必须使用正则表达式,例如
my %toys;
while (my $line = <>) {
while ($line =~ m{ \G \s* ([\w-]+) =\s* (\d+) (?:,|\s*$) }xgc) {
$toys{$1} += $2;
}
}
这不会存储每一行,而是自动总结每只动物的玩具。
数据结构
Perl 不支持多维数组,而是 arrayrefs 的数组,归结为同一件事。
my @AoA = (
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
);
方括号表示匿名数组引用,而花括号表示匿名哈希引用。perldoc perldata
, perldoc perllol
,perldoc perlreftut
和朋友有更多关于这些的信息。