11

次のファイルがあるとします。

department=value1
location=valueA
location=valueB
department=value2

以下を使用して、ファイルを Perl ハッシュにロードします。

use File::Slurp;
use Data::Dumper;
my %hash = map {
   s/#.*//;
   s/^\s+//;
   s/\s+$//;
   m/(.*?)\s*=\s*(.*)/;
} read_file($file);
print Dumper(\%hash);

ただし、結果は次のとおりです。

$VAR1 = {
          'location' => 'valueB',
          'department' => 'value2'
        };

上記のファイルをハッシュにロードするにはどうすればよいですか。

$VAR1 = {
          'location' => 'valueA,valueB',
          'department' => 'value1,value2'
        };

ありがとう。

4

3 に答える 3

22

どうぞ:

my %hash;
while (<FILE>)
{
   chomp;
   my ($key, $val) = split /=/;
   $hash{$key} .= exists $hash{$key} ? ",$val" : $val;
}

これは、「=」記号で分割されたすべての行をウォークスルーし、エントリを追加するか、ハッシュ テーブル内の既存のエントリに追加します。

于 2008-10-24T22:35:53.250 に答える
5

データ ファイルを制御できる場合は、カスタム形式から YAML などに切り替えることを検討してください。これにより、カスタムフォーマットをますますハッキングすることなく、箱から出してすぐに多くのパワーを得ることができます. 特に、リストを作成する複数のキーは自明ではありません。それを行う YAML の方法は、はるかに明確です。

name:       Wally Jones
department: [foo, bar]
location:   [baz, biff]

また、YAML を使用すると、キーと値のペアをスカルプトして、読みやすいように並べることができることにも注意してください。

そして、それを解析するコードはモジュールによって行われ、YAML::XSが最高です。

use File::Slurp;
use YAML::XS;
use Data::Dumper;

print Dumper Load scalar read_file(shift);

データ構造は次のようになります。

$VAR1 = {
          'department' => [
                            'foo',
                            'bar'
                          ],
          'location' => [
                          'baz',
                          'biff'
                        ],
          'name' => 'Wally Jones'
        };
于 2008-10-26T00:21:20.237 に答える
-1

マップ関数にコードを追加して、ハッシュ エントリの存在を確認し、新しい値を追加できますか?

私はしばらく Perl をやっていませんでしたが、過去にこのようなことをしたとき、ファイルを 1 行ずつ ($inputLine = <FILE> の間) 読み取り、'=' で分割してハッシュをロードしました。ハッシュがすでにそのキーを持っているかどうかを確認するために追加のチェックを行い、エントリが既に存在する場合は追加します。

于 2008-10-24T22:39:36.613 に答える