将字符串及其值存储到数组中:Perl

时间:2012-12-05 09:35:35

标签: perl

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

的文本文件

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

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

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

我想将它们输出到格式化的表格中。

我不是在寻找答案,只是指导我如何处理它?<​​/ p>

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

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

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

close FILE;

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

2 个答案:

答案 0 :(得分:5)

  

我不是在寻找答案,只是指导我如何处理它?<​​/ p>

所以这里有一些提示:

  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. 在循环中
  6. ,将部分分为键和值:
    my ($key, $value) = split /=/ => $part

  7. 在你的循环中,将其存储在%data中:
    $data{$key} = $value;

  8. 注意

    我将它留给您作为一个简单的练习,使用多个输入线。另请注意,您在此处使用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 perldataperldoc perllolperldoc perlreftut和朋友可以获得有关这些内容的更多信息。