【问题标题】:parse file and store delimited section in array in Perl在 Perl 中解析文件并将分隔部分存储在数组中
【发布时间】:2012-12-22 04:44:12
【问题描述】:

我需要处理外部数据,一个纯文本文件,其中包含要在 Perl 中处理的数据(我正在学习这种语言)。

{NAME}
orga:21:12348:oragnisation
serv:22:12348:service
{NAME-END}
{DATA}
palm:data:fluid:147
rose:data:fluid:149
{DATA-END}
{OTHER}
palm:data:fluid:147
rose:data:fluid:149
germ:data:fluid:189
{OTHER-END}

如何读取此文件并将每个部分存储在数组中(部分是已知的并在{xxxx}{xxxx-END} 之间分隔。部分中的每个数据都转换为一个列表并存储在数组中。 我希望有这样的东西,例如:

@name = ( ("orga","21","12348","organisation"), ("serv","22","12348","service") )

【问题讨论】:

    标签: regex arrays perl parsing


    【解决方案1】:

    尝试创建根据其他变量的值命名的变量是一个坏主意。最好的方法是构建数组的散列,而不是像@name 这样的单独命名数组。

    类似这个程序的东西可以满足你的需要。我已经使用Data::Dump 来显示程序构建的数据结构。

    use strict;
    use warnings;
    
    use Data::Dump;
    
    open my $fh, '<', 'data.txt' or die $!;
    
    my %data;
    my $sect;
    while (<$fh>) {
      chomp;
      if (/^\{(\w+)\}$/) {
        $sect = $1;
      }
      elsif (/^\{($sect-END)\}$/) {
        undef $sect
      }
      elsif (defined $sect) {
        push @{ $data{$sect} }, [split /:/];
      }
    }
    
    dd \%data;
    

    输出

    {
      DATA  => [
                 ["palm", "data", "fluid", 147],
                 ["rose", "data", "fluid", 149],
               ],
      NAME  => [
                 ["orga", 21, 12348, "oragnisation"],
                 ["serv", 22, 12348, "service"],
               ],
      OTHER => [
                 ["palm", "data", "fluid", 147],
                 ["rose", "data", "fluid", 149],
                 ["germ", "data", "fluid", 189],
               ],
    }
    

    【讨论】:

    • 非常感谢你正是我所需要的!
    【解决方案2】:

    这样的事情怎么样:

    my %list;
    while(<DATA>) {
        chomp;
        if (/^\{(.*?)\}/ .. /^\{${1}-END\}/) {
            push @{$list{$1}}, $_ unless /^\{/;
        }
    }
    say Dumper\%list;
    

    输出:

    $VAR1 = {
              'OTHER' => [
                         'palm:data:fluid:147',
                         'rose:data:fluid:149',
                         'germ:data:fluid:189'
                       ],
              'NAME' => [
                        'orga:21:12348:oragnisation',
                        'serv:22:12348:service'
                      ],
              'DATA' => [
                        'palm:data:fluid:147',
                        'rose:data:fluid:149'
                      ]
            };
    

    【讨论】:

    • 我认为你应该展示一个完整的工作程序,特别是对于正在学习语言的人。我认为错过 use 声明没有任何好处。
    猜你喜欢
    • 2018-12-29
    • 1970-01-01
    • 2013-10-16
    • 2013-06-03
    • 1970-01-01
    • 2010-12-26
    • 1970-01-01
    • 2016-08-06
    • 2012-01-13
    相关资源
    最近更新 更多