3

私の正規表現は本来あるべきほど良くありません。あらかじめお詫び申し上げます。

コード:

#!/usr/bin/perl -wT
use strict;
use warnings;
use Text::ParseWords;

my @AoH;
my $filename = 'metadata.txt';

open(my $fh, '<', $filename) or die "Could not open file '$filename' $!";
while (<$fh>) {
    my $rec = {};
    for my $field ( split ) {
        (my $key, my $value) = quotewords('=', 0, $field);
        $rec->{$key} = $value;
        print "$key -> $value;\n";
    }
    push @AoH, $rec;
}

次の文字列を解析したい (metadata.txt にあります):

video_info="これは動画の説明です" video_name="avideoname.mp4" video_thumb="avideothumbnail.jpg"

基本的に、前述の文字列を分割して、引用符で囲まれているものはすべて値 (空白を含む) であり、= の前にあるものはすべてキーになるようにします。

私の望む出力:

video_info -> This is a video description;
video_name -> avidenoname.mp4;
video_thumb -> avideothumbnail.jpg;

これを参照として使用して、ハッシュの配列を作成しています: http://docstore.mik.ua/orelly/perl/prog3/ch09_03.htm、コードにわずかな変更を加えて (たとえば、分割の代わりに引用語を使用) . これは主に正規表現の問題だと思いますが、問題や非推奨のコードが使用されている場合は、矛盾を修正/説明してください。

どんな助けでも大歓迎です。前もって感謝します。

4

1 に答える 1

8

splitは、スペースで区切られた文字列を、スペースを含む 2 つの部分文字列に分割するのには適していません。

たとえば、あなたの場合、splitこの行に使用されます:

video_info="This is a video description" video_name="avideoname.mp4"

次のような配列が得られます。

qw(video_info="This, is, a, video, description", video_name="avideoname.mp4")

これは絶対に必要な出力ではありません。

quotewords代わりに、次の行を分割するために使用できます。

quotewords('\s+', 0, $_)

あげる:

qw(video_info="This is a video description", video_name="avideoname.mp4")

また、chompの影響を取り除くために、1 行を処理する前に実行することをお勧めし\nます。

#!/usr/bin/perl -w
use strict;
use warnings;
use Text::ParseWords;

my @AoH;
my $filename = 'metadata.txt';

open(my $fh, '<', $filename) or die "Could not open file '$filename' $!";
while (<$fh>) {
    chomp;
    my $rec = {};
    for my $field ( quotewords('\s+', 0, $_) ) {
        (my $key, my $value) = quotewords('=', 0, $field);
        $rec->{$key} = $value;
        print "$key -> $value;\n";
    }
    push @AoH, $rec;
}
于 2013-11-04T06:59:02.103 に答える