0

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") )
4

2 に答える 2

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],
           ],
}
于 2013-01-08T10:57:29.420 に答える
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'
                  ]
        };
于 2013-01-08T10:53:27.473 に答える