文本文件到哈希表

时间:2016-08-08 17:36:28

标签: perl text hash

我想为我文件中的数据创建一个哈希表。

该文件包含一堆写为

的命令
===|showcommand|

每当我看到这个分隔符时,我想创建一个哈希键并将其下面的数据存储为值中的数组,直到它看到下一个分隔符。

下一个分隔符将执行相同的操作,即使用分隔符名称创建哈希键,并将数据存储在数组后面的下一行作为值。

2 个答案:

答案 0 :(得分:0)

my %commands;
my $name;
my $body;
while (<>) {
    if (my ($new_name) = /===\|([^|]*)\|/) {
        $commands{$name} = $body if defined($name);
        $name = $new_name;
        $body = '';
    } else {
        $body .= $_;
    }
}

$commands{$name} = $body if defined($name);

假设命令的主体在标题之后的行上开始,并在具有下一个标题的行之前的行上停止。

答案 1 :(得分:0)

你可能已经有了它,但是仍然添加了一个小注释,关于如何从函数返回哈希的问题。

以下是一个例子:

输入-file (使用以下内容,我认为它包含与输入文件类似的结构。

===|showcommand|
cmd1
cmd2
cmd3
cmd4
===|testcommand|
command1
command2
command3
===|anothercommand|
another1
another2
another3
another4

Perl -script:

use strict;

# Calling ReadCommandFile to build hash.
my %commands = ReadCommandFile("./commands.txt");

# ReadCommandFile - reads commands.txt and builds
# a hash.
sub ReadCommandFile()
{
  my $file = shift;
  my %hash = ();
  my $name;

  open(FILE, "<$file");

  while(<FILE>)
  {
    if($_ =~ /===\|(.*)\|/)
    {
      $name = $1;
      $hash{$name} = [];      
    }
    else
    {
      my $line = $_;
      $line =~ s/\n$//;
      push(@{$hash{$name}}, $line);
    }
  }

  close(FILE);

  return %hash;
}

因此,您应该获得以下哈希值(Data :: Dumper的输出):

$VAR1 = 'anothercommand';
$VAR2 = [
          'another1',
          'another2',
          'another3',
          'another4'
        ];
$VAR3 = 'showcommand';
$VAR4 = [
          'cmd1',
          'cmd2',
          'cmd3',
          'cmd4'
        ];
$VAR5 = 'testcommand';
$VAR6 = [
          'command1',
          'command2',
          'command3'
        ];

然后您可以访问以下各个元素:

从“showcommand”获取第三个命令:

print "\nCommand #3: " . $commands{'showcommand'}[2];

输出: cmd3

将文件中的数据复制到散列中,并将命令作为数组添加到相应的关键字下。

谢谢!