Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在perl中从哈希表打印数据时出现的问题_Perl - Fatal编程技术网

在perl中从哈希表打印数据时出现的问题

在perl中从哈希表打印数据时出现的问题,perl,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

我试图在单个文件中处理数据。我必须读取该文件并创建一个散列结构,获取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 = {
          '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'


        };

在我继续之前,请给我一个建议:

记录您的代码

在你的代码中有几个逻辑错误,如果你写下你认为每一行应该做的事情,我想你会意识到的。首先,写下您想要实现的算法,然后记录代码中的每个步骤如何实现算法中的一个步骤。最后,您将能够看到您遗漏了什么,或者哪些部分不起作用

以下是我看到的错误

  • 您没有忽略不应该分析的行。例如,您正在抓取“}”和“{”行
  • 实际上,您并没有存储水果的名称。您抓取了它,但立即开始下一个循环,而不存储它
  • 你没有跟踪每个结构。你需要为每个水果建立一个新的结构
  • 是否确实要在值中保留双引号
  • 其他需要担心的事情:

  • 您是否保证属性列表按此顺序排列?例如,
    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;
    

    在我继续之前,请给我一个建议:

    记录您的代码

    在你的代码中有几个逻辑错误,如果你写下你认为每一行应该做什么,我想你会发现的。首先,写下你想实现的算法,然后记录代码中的每个步骤是如何实现算法中的一个步骤的。最后,你会看到你错过了什么,或者哪一部分不起作用

    以下是我看到的错误

  • 您没有忽略不应该分析的行。例如,您正在获取“}”和“{”行
  • 实际上,您并没有存储水果的名称。您抓取了它,但立即开始下一个循环,而不存储它
  • 你没有跟踪每个结构。你需要为每个水果建立一个新的结构
  • 是否确实要在值中保留双引号
  • 其他需要担心的事情:

  • 您是否保证属性列表按此顺序排列?例如,
    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;
    

    哈希表的用途是什么?如果您只想修改文件中的行,为什么需要它?是的。您的查询是绝对有效的。但我的要求要求我在这里使用哈希表概念。我使用shell脚本实现了输出。但现在需要使用perl和哈希概念来完成。我坚持这一点:(你的问题实际上是关于阅读配置(输入)将文件转换成散列?然后修改散列,然后将散列打印成文件?在这种情况下,我建议使用JSON而不是自定义的输入文件格式。这样修改就容易多了,因为已经存在用于读取和写入JSON的模块。好的。谢谢。我会尝试。但是我可以知道我在哪里出错了吗上面的代码?只是好奇。欢迎您,祝您好运!关于您显示的输出。我认为代码有很多问题。但有一件事是为什么水果信息丢失。我认为这是因为您在空格上拆分,并且带有水果信息的行以至少两个空格开头,所以可能所有这些行都会被删除映射到输出中的行
    ''=>unde
    ?哈希表的用途是什么?如果您只想修改文件中的行,为什么需要它?是的。您的查询绝对有效。但我的要求要求我在这里使用哈希表概念。我使用shell脚本实现了输出。但现在需要使用perl和hash con完成当然,我被这个问题困住了:(你的问题实际上是关于阅读配置(输入)将文件转换成散列?然后修改散列,然后将散列打印成文件?在这种情况下,我建议使用JSON而不是自定义的输入文件格式。这样修改就容易多了,因为已经存在用于读取和写入JSON的模块。好的。谢谢。我会尝试。但是我可以知道我在哪里出错了吗上面的代码?只是好奇。欢迎您,祝您好运!关于您显示的输出。我认为代码有很多问题。但有一件事是为什么水果信息丢失。我认为这是因为您在空格上拆分,并且带有水果信息的行以至少两个空格开头,所以可能所有这些行都会被删除映射到输出中的行
    ''=>unde
    $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'
              }
            ];