質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.50%

  • Webサイト

    1079questions

    一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

  • XML

    653questions

    XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

  • Perl

    457questions

    Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

  • CPAN

    15questions

    CPAN(Comprehensive Perl Archive Network)は、 Perlのライブラリ・モジュールやPerlで書かれたソフトウェアを集めまとめたものです。

Perl ハッシュリファレンスの作成

受付中

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 478

BANDIT1250FABS

score 78

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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

+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で質問しよう!

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    リストを出す時のソートについて

    CGIのフォーム部分を改造しようとしています。 セレクトの部分なんですが、設定した順番通りに並べたいです。 (現在は50音順(?)でソートされてしまっている) 現在以下のようにな

  • 解決済

    php ログインについて

    お世話になります。 現在phpでログイン画面を作っているのですがうまくいかず困っています。 ********** <?php require_once 'h.php'; # 

  • 解決済

    Android CardRecyclerView表示されない

    Androidアプリを開発中です。 その中でこちらのcardslibライブラリを使用しています。 実際にはFragmentの中でCardRecyclerViewを以下のように実装し

  • 解決済

    index.ctpに書いた変数をcontrollerの中に書き直す記述の仕方が知りたい。

    皆さんお疲れ様です。 先ほどこちらの質問をさせていただいた者です。 foreachの中でtableを回すとき、そのtable内のstatusの値の表示を変更したい。 一先ず、ち

  • 解決済

    Tie::IxHashについて

    CPANモジュールを利用してハッシュ配列の中身を格納順のままに設定したいと考えております。 しかし、push関数を使用すると中身がバラバラになってしまいます。 お詳しい方いらっし

  • 解決済

    RubyのXML操作について

    お世話になっております。 以下のように変数をセットしたいのですが、現状エラーが出て上手くいきません。 rexmlを使用した変数の代入方法をご教授願います。 ----------

  • 解決済

    perlの変数について

    当方perlの知識が浅いですが、よろしくお願いします。 perlの勉強中でして、 perlで書かれたスクリプトを読んでいるのですが、 いまいち理解できない文がありましたので、それ

  • 受付中

    jsonファイルの読み込み

    python3系でjsonファイルを読み込みたいと考えています. 以下のように読み込むとdict型になると各サイト等に書いてあるのですが, list型になってしまいます. >>>

同じタグがついた質問を見る

  • Webサイト

    1079questions

    一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

  • XML

    653questions

    XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

  • Perl

    457questions

    Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

  • CPAN

    15questions

    CPAN(Comprehensive Perl Archive Network)は、 Perlのライブラリ・モジュールやPerlで書かれたソフトウェアを集めまとめたものです。