我有一个名为grabPet.pl
的Perl文件和一个名为Pets.txt
每只宠物都有许多与之相关的玩具。所以a:cat=5
mouse=3, cat=5, dog=9,
我想将它们输出到格式化的表格中。
我不是在寻找答案,只是指导我如何处理它?</ p>
我在想可能是一个二维数组,但我不认为perl支持它。
open(FILE, "<pet.txt") || die"could not read);
while (<FILE>) {
push (@lines, $line);
}
close FILE;
答案 0 :(得分:5)
我不是在寻找答案,只是指导我如何处理它?</ p>
所以这里有一些提示:
确保输入行不以换行符结束
chomp (my $line = <FILE>);
split
您的输入字符串:
my @parts = split /, */ => $line; # split on commas and whitespace
准备哈希来存储您的数据,因为它包含键值对:
my %data;
遍历您的部分:
foreach my $part (@parts) { ... }
,将部分分为键和值:
my ($key, $value) = split /=/ => $part
在你的循环中,将其存储在%data
中:
$data{$key} = $value;
注意强>
我将它留给您作为一个简单的练习,使用多个输入线。另请注意,您在此处使用open
错误:
open(FILE, "<pet.txt" || die "could not read");
因为错误检查不符合您的预期。替换为
open(FILE, '<pet.txt') || die "could not read";
或更好的可读性:
open FILE, '<pet.txt' or die "could not read";
并且更好地使用词法文件句柄,三个参数并包含真正的错误消息:
open my $file, '<', 'pet.txt' or die "could not read: $!";
...
chomp (my $line = <$file>);
答案 1 :(得分:3)
如果数据非常有序,您可以在每一行split
。如果我们用前面的空格拆分逗号,我们就会获得动物 - 动物对,然后我们可以在等号上分开。我会写这个:
my %toys = map {split /=/, $_, 2} split /,\s*/, $line;
有趣的位是map
函数,第三个参数在一种情况下分割,但在另一种情况下不分裂。其中的原因是perldoc -f
中的文档,并且源于此处发生的列表到哈希强制。
然后,您可以引用哈希并将其填充到数组中,例如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]
);
方括号表示匿名数组引用,而curlies表示匿名哈希引用。 perldoc perldata
,perldoc perllol
,perldoc perlreftut
和朋友可以获得有关这些内容的更多信息。