从文本文件创建Perl哈希表

3
我是一个新手,正在尝试从文本文件中创建一个哈希表。我有一个与代码相分离的文本文件,旨在供其他人编辑。假设他们应该熟悉Perl,并知道在哪里进行编辑。文本文件实际上包含了几个哈希嵌套的哈希,完整地使用正确的语法、缩进等,就像正常的Perl代码一样。键和值将不同,但所有的哈希嵌套都将具有相同的深度。
问题:如何将此文件读入我的代码并能够使用这些哈希表?
在学习中,我尝试了一个“打开(FILE)”,然后是一个“while”,但是将每行代码放入@rray中并不能保留哈希表。或者我是否必须使用每行代码来创建我在代码中要使用的几个哈希嵌套?
感谢任何协助。
Rod
3个回答

4

这很简单:

 my $nested_hash = do "your_file.txt";

所以,如果your_file.txt文件中包含以下内容:
{
  a => 1,
  b => [1,2,3],
  c => {
    c1 => 42
    c3 => {
      c11 => 21
    }
  }
}

那么$nested_hash可以这样使用:

$nested_hash->{a}   # equals 1
$nested_hash->{b}   # the array reference [1,2,3]

$nested_hash->{c}->{c1} # equals 42

你的外部文本文件中也可以有多个数据结构;只需将它们定义为由,分隔的列表即可。
your_file.txt中:
{
  a => 1,
  b => [1,2,3],
},
{
  c => 3,
  d => 4,
}

当你从脚本中读取它们时,你需要使用列表上下文:

my @nested_hashes = do "your_file.txt";

So

$nested_hashes[0]->{a}  # gives you 1
$nested_hashes[1]->{c}  # gives you 3

谢谢,Faiz。由于我经验不足,没有表达清楚是我的错。我想要的是将外部文件中的整个哈希结构复制到我的代码中,并将其作为哈希进行操作。今天只有一个哈希的哈希。明天,可能会有两个或更多,因为其他人将他们想要的添加到文件中。第二天,可能就没有了。 Rod - Rod
谢谢,Faiz。你发的内容肯定会在未来帮到我,但现在,我仍然需要找到一些方法来快速读取该文件的全部内容,并将其作为哈希的列表查看。我可能别无选择,只能硬编码一个子程序来处理单个行,从数组创建内部哈希。一个哈希表可能是这样的: 键->子键->值。下周,有人可能会添加: 键->子键->值值 ->子键->值第二天,其他人可能会添加具有3个不同值的子键。而我必须处理它们所有。 - Rod
很抱歉,但是如果我不能更好地理解您的问题,除了我已经发布的内容之外,我无法提供任何具体的帮助。您目前尝试了什么?例如,您是否有任何代码片段,例如您不想硬编码的子程序? - Faiz
谢谢,Faiz。你的第一个例子,那个带有“c”键的例子,与我的问题最接近,如果不是完全相同的话。基本上,我想复制哈希结构本身,而不仅仅是读取键和值。根据我的有限经验,到目前为止,我所做的最多的就是简单地读取文件并将所有内容放入数组中,这很容易,但这并不意味着我有一个哈希或哈希的哈希,就像你的第一个“c”示例一样。它只是意味着我有一个数组,其中每行包含来自文本文件的项目。 - Rod
Faiz,我的错。再一次,我的经验不足让我失误了。我错过了你的“@nested_hashes”。我在“$nested_hashes”上工作了。看起来“@nested_hashes”会起作用。明天我会在工作中尝试这个方法。非常感谢你的努力。Rod。 - Rod
显示剩余2条评论

1

所以你有一个哈希文件,我们称之为 bar.pm:

our $hash = {
      a => 1,
      b => [1,2,3],
    },
    {
      c => 3,
      d => 4,
    } ; 

our $hosh = {
      v => 1,
      w => [1,2,3],
    },
    {
      x => 3,
      y => 4,
    } ;

1;

现在另一个脚本中的以下代码:

use strict;
use warnings ;
use Data::Dumper ; 

require('bar.pm') ;
our $hash ; 
our $hosh ;
print Dumper $hash ; 
print Dumper $hosh ;

根据 print Dumper 的输出,它可以满足您的需求。

但是您仍然需要知道哪些哈希表在 bar.pm 文件中定义,因为您需要使用 our 将它们放入您的代码中。为了避免这种情况,您可以在 bar.pm 中定义一个包含所有哈希表的主哈希表。

如果仅仅因为:

"假设他们应该熟悉 Perl,并且知道在哪里进行编辑"

这似乎有些危险。CPAN 上有许多配置模块可能会更好。


1
使用Data::Dumper。
首先,创建一个数据结构并将其保存到文件中。
use Data::Dumper;

my $hash = {
    'k1' => 'v1',
    'k2' => 2,
};

open my $output, '>', 'data' or die $!;
print $output Dumper $hash;

文件 data 应该长这样:
$VAR1 = {
          'k2' => 2,
          'k1' => 'v1'
        };

这可以由人类进行编辑。

现在,如果您想将数据返回到您的程序中(例如在人类编辑后):

my $hash = do 'data';

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接