【问题标题】:Perl Hash From Text File来自文本文件的 Perl 哈希
【发布时间】:2013-12-05 10:48:09
【问题描述】:

我是 Perl 新手,正在尝试从文本文件创建哈希。我有一个代码外部的文本文件,旨在供其他人编辑。假设他们应该熟悉 Perl 并且知道在哪里编辑。文本文件本质上包含几个哈希值,包括正确的语法、缩进等,就像普通的 Perl 代码一样。键和值会有所不同,但所有散列的散列将具有相同的深度。

问题:如何将这个文件读入我的代码并能够使用这些哈希?

在学习中,我尝试了一个“打开(文件)”然后是一个“while”,但是将每一行放入 @rray 并不会保留哈希值。还是我必须使用每一行在我的代码中创建多个哈希值?

感谢您的帮助。

杆

【问题讨论】:

    标签: perl text hash


    【解决方案1】:

    真的很简单:

     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";
    

    所以

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

    【讨论】:

    • 谢谢,法伊兹。由于我的经验不足,我的错是不够清楚。我想我正在寻找的是将该外部文件中的整个散列结构复制到我的代码中并将其作为散列处理。今天,只有一个哈希值。明天,可能会有两个或更多,因为其他人将他们想要的内容添加到文件中。第二天,可能就没有了。杆
    • 谢谢,法伊兹。您发布的内容将来肯定会对我有所帮助,但就目前而言,我仍然需要找到一些方法来快速读取该文件的全部内容并将其视为哈希列表。我可能别无选择,只能硬编码一个 sub 以在单独的行上工作以从数组创建内部散列。一个哈希将类似于: key -> sub-key -> values 。下周,有人可能会添加:key -> sub-key -> value value -> sub-key -> value 第二天,其他人可能会添加 3 个不同值的子键。而且我必须为所有这些工作。
    • 很抱歉,如果没有更好地了解您的问题,除了我发布的内容之外,我无法提供任何具体的帮助。你都尝试了些什么?您是否有任何代码,例如您不想硬编码的子程序?
    • 谢谢,法伊兹。您的第一个示例,即带有“c”键的示例,如果与我的问题不同,则最接近。基本上,我想复制哈希结构本身,而不仅仅是读取键和值,根据我有限的经验,到目前为止我所做的最多的是简单地读取文件并将所有内容放入一个数组中,这很容易足够了,但这并不意味着我有一个或多个哈希值,就像你的第一个'c'示例一样。这只是意味着我有一个数组,其中每一行都包含来自文本文件的项目。
    • 法伊兹。我的错。再一次,我的缺乏经验让我失望了。我错过了你的“@nested_hashes”。我在“$nested_hashes”上工作。看起来“@nested_hashes”会起作用。我明天在工作中试试这个。谢谢你的努力。罗德。
    【解决方案2】:

    所以你有一个哈希文件,我们称之为 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 上有许多配置模块可能会更好。

    【讨论】:

      【解决方案3】:

      使用数据::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';
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-11
        • 2018-04-02
        • 2013-03-06
        • 2016-07-23
        • 2014-02-27
        • 2014-07-13
        • 2011-11-29
        • 1970-01-01
        相关资源
        最近更新 更多