Perl ハッシュリファレンスの作成
受付中
回答 1
投稿
- 評価
- クリップ 1
- VIEW 1,779
CPANモジュール XML::SimpleのXMLoutを利用してハッシュをXMLに変換したいと思っております。
下記ハッシュのデータをXMLoutの引数として利用可能なリファレンス値にする方法をご存知の方
ご教授いただけますと助かります。
ハッシュ
%hash ( "key1" => "data1"
"key2" => "data2"
);
↓ 変換
XMLoutで利用可能なリファレンス値
$hashRef { "key1" => ['data1']
"key2" => ['data2']
}
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
+2
指定されたデータに変換する方法が見つからなかったので、作成してみました。
以下の条件であると仮定して作成しています。
- スカラーは配列化する
- 連想配列内の連想配列も対象とする
- 連想配列以外のリファレンスはそのままとする
use Data::Dumper;
use XML::Simple;
use strict;
use warnings;
# テストデータ
my $test_data = {
test1 => undef,
test2 => 'data2',
test3 => 'data3',
test4 => ['data4'],
test5 => {
test5_1 => 'data5_1',
test5_2 => 'data5_2'
},
test6 => {
test6_1 => ['data6_1'],
test6_2 => ['data6_2']
}
};
print Dumper( _create_xmlout_data($test_data) );
print XMLout( _create_xmlout_data($test_data) );
# 連想配列を展開して、XMLout用データを作成する
sub _create_xmlout_data {
my ($data) = @_;
my $res = $data;
if ( defined($data) && ref($data) eq 'HASH' ) {
# 連想配列のリファレンスの場合は
# キーごとに調査を行う
$res = {};
foreach my $key ( keys( %{$data} ) ) {
if ( ref( $data->{$key} ) ) {
# リファレンスの場合は
# 再帰でデータ作成を行う
$res->{$key} = _create_xmlout_data( $data->{$key} );
}
else {
# リファレンスで無い場合は
# 配列化してデータを格納する
$res->{$key} = [ $data->{$key} ];
}
}
}
return $res;
}
実行結果
$VAR1 = {
'test5' => {
'test5_1' => [
'data5_1'
],
'test5_2' => [
'data5_2'
]
},
'test1' => [
undef
],
'test4' => [
'data4'
],
'test3' => [
'data3'
],
'test6' => {
'test6_2' => [
'data6_2'
],
'test6_1' => [
'data6_1'
]
},
'test2' => [
'data2'
]
};
<opt>
<test1></test1>
<test2>data2</test2>
<test3>data3</test3>
<test4>data4</test4>
<test5>
<test5_1>data5_1</test5_1>
<test5_2>data5_2</test5_2>
</test5>
<test6>
<test6_1>data6_1</test6_1>
<test6_2>data6_2</test6_2>
</test6>
</opt>
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.13%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる