Проблема в печати данных из хеш-таблицы в Perl - PullRequest
0 голосов
/ 19 сентября 2018

Я пытаюсь обработать данные в одном файле.Мне нужно прочитать файл и создать хеш-структуру, получить значение fruitname, добавить его к fruitCount и fruitValue, удалить строку fruitName и записать весь вывод после внесения изменений. Ниже приведено содержимое файла.

 # this is a new file
{
date 14/07/2016
time 11:15
end 11:20
total 30
No    "FRUITS"
Fruit_class
    {
    Name    "fruit 1"
    fruitName    "apple.fru"
    fruitId    "0"
    fruitCount    5
    fruitValue    6
    }
{
        Name    "fruit 2"
        fruitName       "orange.fru"
        fruitId "1"
        fruitCount      10
        fruitValue      20
        }
}

Я пытался использовать следующий код:

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my %hash_table;
my $name;
my $file = '/tmp/fruitdir/fruit1.txt';
open my $fh, "<", $file or die "Can't open $file: $!";
while (<$fh>) {
    chomp;
    if (/^\s*fruitName/) {
        ($name) = /(\".+\")/;
        next;
   }
   s/(fruitCount|fruitValue)/$name\.$1/;
   my ($key, $value) = split /\s+/, $_, 2;
   $hash_table{$key} = $value;
}
print Dumper(\%hash_table);

Это не работает.Мне нужно добавить значение имени фрукта и распечатать все содержимое файла в качестве вывода.Любая помощь будет оценена. Ниже приведен вывод, который я получил.

$VAR1 = {
          '' => undef,
          'time' => '11:15    ',
          'date' => '14/07/2016',
          '{' => undef,
          '#' => 'this is a new file',
          'total' => '30    ',
          'end' => '11:20    ',
          'No' => '"FRUITS"',
          'Fruit_class' => undef,
          '}' => undef
        };

Ожидаемый хэш в качестве вывода:

$VAR1 = {
          'Name' => '"fruit 1"',
          'fruitId' => '"0"            ',
          '"apple_fru".fruitValue' => '6            ',
          '"apple_fru".fruitCount' => '5'

          'Name' => '"fruit 2"',
          'fruitId' => '"0"            ',
          '"orange_fru".fruitValue' => '10            ',
          '"orange_fru".fruitCount' => '20'


        };

1 Ответ

0 голосов
/ 01 октября 2018

Один совет, прежде чем я продолжу:

Документируйте свой код

В вашем коде есть несколько логических ошибок, которые, я думаю, вы бы распознали, если бы написаливниз, что вы думали, что каждая строка должна была сделать.Сначала запишите алгоритм, который вы хотели бы реализовать, а затем задокументируйте, как каждый шаг в коде реализует шаг в алгоритме.В конце вы сможете увидеть, что вы пропустили, или какая часть не работает.

Вот ошибки, которые я вижу

  1. Вы не игнорируете строки, которыеВы не должны анализировать.Например, вы берете строки '}' и '{'.
  2. На самом деле вы не сохраняете название фрукта.Вы берете его, но сразу же начинаете следующий цикл, не сохраняя его.
  3. Вы не отслеживаете каждую структуру.Вам нужно создать новую структуру для каждого фрукта.
  4. Вы действительно хотите сохранить двойные кавычки в значениях?

Другие вещи, о которых нужно беспокоиться:

  1. Гарантируется ли, что список атрибутов находится в таком порядке?Например, может ли Name прийти последним?

Вот некоторый код, который делает то, что я думаю, вы хотите.

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my %hash_table;
my $name;

my @fruit;

my $file = '/tmp/fruitdir/fruit1.txt';
open my $fh, "<", $file or die "Can't open $file: $!";
while (<$fh>) {
    chomp;

    # save hash table if there's a close bracket, but
    # only if it has been filled
    if ( /^\s*}\s*$/ ) {
        next unless keys %hash_table;

        # save COPY of hash table
        push @fruit, { %hash_table };

        # clear it out for the next iteration
        %hash_table = ();
    }

    # only parse lines that start with Name or fruit
    next unless
      my ( $key, $value ) =
      /^
         # skip any leading spaces
         \s*

         # parse a line beginning with Name or fruitXXXXX
         (
          Name
          |
          fruit[^\s]+
        )

        # need space between key and value
        \s+

        # everything that follows is a value. clean up
        # double quotes in post processing
        (.*)
     /x;

    # remove double quotes
    $value =~ s/"//g;

    if ( $key eq 'Name' ) {
        $name = $value;
    }
    else {
        $key = "${name}.${key}";
    }
   $hash_table{$key} = $value;
}

print Dumper \@fruit;

и вот вывод:

$VAR1 = [
          {
            'fruit 1.fruitValue' => '6',
            'fruit 1.fruitName' => 'apple.fru',
            'Name' => 'fruit 1',
            'fruit 1.fruitCount' => '5',
            'fruit 1.fruitId' => '0'
          },
          {
            'fruit 2.fruitName' => 'orange.fru',
            'fruit 2.fruitId' => '1',
            'fruit 2.fruitCount' => '10',
            'fruit 2.fruitValue' => '20',
            'Name' => 'fruit 2'
          }
        ];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...