ファイルをPerlハッシュに読み込むにはどうすればよいですか?
質問
次のファイルを指定します:
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を使用してハッシュを読み込み、ハッシュに既にそのキーが含まれているかどうかを確認し、エントリが既に存在する場合は追加します。
所属していません StackOverflow