2

私は次のようにファイルを持っています:

<country=HK>

    TCN=1
    CURR_TYPE="RS"
    PRICE=10
    COMP_NAME="IBM"

    TCN=2
    CURR_TYPE="RS"
    PRICE=200
    COMP_NAME="CTS"

    TCN=3
    CURR_TYPE="RS"
    PRICE=50
    COMP_NAME="TCS"


endHK

<country=JN>

    TCN=1
    CURR_TYPE="YEN"
    PRICE=10
    COMP_NAME="IBM"

    TCN=2
    CURR_TYPE="YEN"
    PRICE=200
    COMP_NAME="CTS"

    TCN=3
    CURR_TYPE="YEN"
    PRICE=50
    COMP_NAME="TCS"

</country=JN>

ここで、Perlスクリプトを使用して、上記のファイルのメンバーから値を取得したいと思います。

私のPerlスクリプトファイルは次のとおりです。

#!perl

open(FH, "<a.txt");
@a=<FH>;
$b=$#a;
for ($n=0;$n<$b;$n++)
{
    if ($a[$n]=~/HK/)
    {
        foreach $_ ( @a[$n..($n+300)])
        {               
            if($_ =~ /endHK/){ exit 0;}
            print $_;
        }
    }
}

close(FH);

上記のファイルからデータを取得するのに役立つコードを追加してください。

4

1 に答える 1

5

endHK貼り付けられたコードは 2 つの異なる終了タグ (と)を使用していますが、ファイルの解析は難しくありません</country=JN>。単純なデータを解析するための基本的なレシピは次のようになります。

ファイルを取得します。

use autodie;
open(FILE, '<', 'file.txt');
my @data = <FILE>;
close(FILE);

その内容をループします。

my (%file, $country);
foreach my $line (@data) {

不要な文字を削除します。

chomp $line;
$line =~ s/^\s+|\s+$//g;
next unless $line;

そして、いくつかのデータ構造を構築します:

if($line =~ m!^<country=([^>]+)>!) {
    $country = $1;
}
elsif($line =~ m!^([^<=]+)=(.+)$!) {
    my ($key, $value) = ($1, $2);
    $value =~ s/"//g;

    $file{$country}->{$key} = $value;
}

出力を確認します。

print Dumper \%file;

これにより、次のように出力されます。

$VAR1 = {
          'HK' => {
                    'PRICE' => '50',
                    'CURR_TYPE' => 'RS',
                    'COMP_NAME' => 'TCS',
                    'TCN' => '3'
                  },
          'JN' => {
                    'PRICE' => '50',
                    'CURR_TYPE' => 'YEN',
                    'COMP_NAME' => 'TCS',
                    'TCN' => '3'
                  }
        };

また: Config::Generalを見てください。このモジュールは、そのようなデータを処理する「より安全な」方法を提供します。

于 2012-07-16T10:24:18.383 に答える