0

我有一个名为的 Perl 文件grabPet.pl和一个名为的文本文件Pets.txt

每只宠物都有许多与之相连的玩具。所以一个:cat=5

猫会有 5 个玩具。它们用逗号分隔,所以:

mouse=3, cat=5, dog=9,

我想将这些输出到格式化的表格中。

我不是在寻找答案,只是关于如何处理它的指导?

我在想可能是一个二维数组,但我认为 perl 不支持它。

open(FILE, "<pet.txt") || die"could not read);

while (<FILE>) {
      push (@lines, $line);
  }

close FILE;

http://i.stack.imgur.com/F2Ej6.png

4

2 回答 2

5

我不是在寻找答案,只是关于如何处理它的指导?

所以这里有一些提示:

  1. 确保您的输入行不以换行符结尾
    chomp (my $line = <FILE>);

  2. split你的输入字符串:
    my @parts = split /, */ => $line; # split on commas and whitespace

  3. 准备一个哈希来存储您的数据,因为它包含键值对:
    my %data;

  4. 循环你的部分:
    foreach my $part (@parts) { ... }

  5. 在您的循环中,将部分拆分为键和值:
    my ($key, $value) = split /=/ => $part

  6. 在您的循环中,将其存储在%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>);
于 2012-12-05T09:48:25.463 回答
3

解析

如果数据很有序,可以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和朋友有更多关于这些的信息。

于 2012-12-05T09:52:02.743 回答