簡體   English   中英

在Perl中從哈希表打印數據時出現問題

[英]Issue in Printing data from a hash table in perl

我正在嘗試在單個文件中處理數據。 我必須讀取文件並創建一個哈希結構,獲取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);

這是行不通的。 我需要附加fruitname的值,並將整個文件內容打印為輸出。 任何幫助將不勝感激。以下是我得到的輸出。

$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. 您不會忽略不應該解析的行。 例如,您正在抓取'}'和'{'行。
  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'
          }
        ];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM