ファイルをPerlハッシュに読み込むにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/235437

  •  04-07-2019
  •  | 
  •  

質問

次のファイルを指定します:

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'
        };

ありがとう。

役に立ちましたか?

解決

ここに行きます:

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

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

他のヒント

データファイルを制御できる場合は、カスタム形式から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'
        };

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

私はしばらくPerlをやったことがありませんが、過去にこのようなことをしたとき、ファイルを1行ずつ($ inputLine = <!> lt; FILE <!> gt;で)読みました。 '='でsplitを使用してハッシュを読み込み、ハッシュに既にそのキーが含まれているかどうかを確認し、エントリが既に存在する場合は追加します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top