2013-01-08 20 views
0

我需要使用外部数据,一个纯文本文件,其中包含要在Perl中处理的数据(我正在学习该语言)。在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")) 

回答

6

这是一个坏主意,尝试创建根据其他变量的值命名的变量。最好的方法是构建一个数组散列而不是单独的命名数组,如@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], 
      ], 
} 
+0

非常感谢你,正是我需要的! – lurgann

0

怎么是这样的:

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' 
        ] 
     }; 
+2

我想你应该展现一个完整的工作程序,特别是对人谁是学习语言。我错过了'use'语句看不到任何优势。 – Borodin