0

と呼ばれる Perl ファイルとgrabPet.plと呼ばれるテキスト ファイルがあります。Pets.txt

各ペットには、リンクされた多数のおもちゃがあります。だから:cat=5

猫は5つのおもちゃを持っています。それらはコンマで区切られているため、次のようになります。

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

これらをフォーマットされた表に出力したい。

答えを探しているのではなく、どのようにアプローチできるかについてのガイダンスだけですか?

私はおそらく 2 次元配列を考えていますが、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";

レキシカル ファイル ハンドルと 3 つの引数を使用し、実際のエラー メッセージを含めることをお勧めします。

open my $file, '<', 'pet.txt' or die "could not read: $!";
...
chomp (my $line = <$file>);
于 2012-12-05T09:48:25.463 に答える
3

解析中

データが非常に整然としている場合は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 perldataperldoc perllolperldoc perlreftutおよび友人は、これらに関する詳細情報を持っています。

于 2012-12-05T09:52:02.743 に答える