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

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

ただいまの
回答率

90.34%

  • Webサイト

    1126questions

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

  • XML

    687questions

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

  • Perl

    463questions

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

  • CPAN

    15questions

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

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

受付中

回答 1

投稿

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

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>

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • Webサイト

    1126questions

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

  • XML

    687questions

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

  • Perl

    463questions

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

  • CPAN

    15questions

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