1

私は、セミコロンで区切られた、引用符で囲まれた ID と対応する値を含む文字列がたくさんある Perl プロジェクトに取り組んでいます。

例: main_id "1234567"; second_id "My_ID"; 名前「アンドレアス」;

すべての ID 名の後ろとすべてのセミコロンの後ろに空白があります。

私が扱っている2つの問題があります:

問題 1: 特定の ID の値 (引用符なし) を取得する最速の方法は? 私の最初の試みはうまくいきませんでした:

$id_list = 'main_id "1234567"; second_id "My_ID"; name "Andreas";';
$wanted_id = 'second_id';
($value = $id_list) =~ s/.*$wanted_id\w"([^"])";.*/$1/;

問題 2: この文字列 ID を特定の ID のハッシュに変換する最速の方法は次のようになります。

文字列: main_id "1234567"; second_id "My_ID"; 名前「アンドレアス」;

「second_id」のハッシュ:

hash{My_ID} = {main_id => 1234567, second_id => My_ID, name => Andreas}

私が試したこと:

$id_list = 'main_id "1234567"; second_id "My_ID"; name "Andreas";';
$wanted_id = 'second_id';
%final_id_hash;
%hash;
my @ids = split ";", $id_list;
foreach my $id (@ids) {
   my ($a,$b)= split " ", $id;
    $b =~ s/"//g;
    $hash{$a} = $b;
}    
$final_hash{$hash{$wanted_id}}= \%hash;

これはうまくいきましたが、より速い/より良い解決策はありますか?

4

2 に答える 2

1

Text::ParseWordsモジュール (標準の Perl ディストリビューションの一部) により、これが簡単になります。

#!/usr/bin/perl

use strict;
use warnings;
use 5.010;

use Text::ParseWords;
use Data::Dumper;

my %final_hash;
my $wanted_id = 'second_id';
my $id_list = 'main_id "1234567"; second_id "My_ID"; name "Andreas";';

my @words = parse_line '[\s;]+', 0, $id_list;
pop @words; # Lose the extra field generated by the ; at the end
my %hash = @words;

$final_hash{$hash{$wanted_id}} = \%hash;

say Dumper \%final_hash;
于 2013-05-13T16:08:00.277 に答える
0

問題1、

my %hash = map {
  map { s/ ^" | "$ //xg; $_ } split /\s+/, $_, 2;
}
split /;\s+/, qq{main_id "1234567"; second_id "My_ID"; name "Andreas"};

use Data::Dumper; print Dumper \%hash;
于 2013-05-13T15:25:44.060 に答える