blog20100901

2013/08/20 - プログラミング言語 Perl にまつわる etc. - Perl monger
参考 : perldoc, perldoc.jp, search.cpan.org, perldoc.perl.org ...
「 初めての Perl 第 6 版 」(オライリー・ジャパン発行 ISBN978-4-87311-567-2) 」
「 続・初めての Perl 改訂版 」(オライリー・ジャパン発行 ISBN4-87311-305-9) 」
「 Effective Perl 第 2 版 」(翔泳社発行 ISBN978-4-7981-3981-4) 」 ... etc,.

Perl Perl_5

Perl モジュール Data::Dumper 01 simple usage (d022)

Perl モジュール Data::Dumper 01 simple usage (d022)

目次 - Perl Index



Theme



Perl について、復習を兼ねて断片的な情報を掲載して行く連載その d022 回。

Perl で、データ構造をダンプ / eval 出来る便利なモジュール「 Data::Dumper 」のドキュメントから「 EXAMPLES 」のコードを確認する。

今回は、「 simple usage 」のコードを確認します。

 ・ 機能のおさらい
 ・ simple usage ( シンプルな用法 )
 ・ pretty print (no array indices)
 ・ Terse = 1, Indent = 0
 ・ Inden = 1
 ・ Indent = 3
 ・ Useqq = 1
 ・ Pair = " : "


機能のおさらい



前回 (d021) で確認したモジュール「 Data::Dumper 」の機能を簡単におさらいします。

「 Data::Dumper 」は、Perl のデータ構造の文字列化した出力と eval を行うためのモジュールで、スカラのリストやリファレンスを渡すと、その内容を Perl 構文で書き出してくれます。

リファレンスはオブジェクトとして扱うこともできて、自己参照 ( self-reference ) の構造も正しく取り扱うことができます。

外部に書き出したリファレンスの構造体でも eval することで同じものを取り戻すことができます。ただし、このときの eval は文字列 eval (0x271) なので、ソースの信頼性を十分考慮しなければいけません。

デフォルトでリファレンスは「 $VARn 」と名付けられます。ことのときの「 n 」は数値型のサフィックスです。構造体内部の他のリファレンスは矢印記法を利用して適切にラベリングされます。

メソッド「 $Data::Dumper::Varname 」や「 $Data::Dumper::Terse 」を利用すれば、デフォルトの名前「 $VAR 」や出力の形式を変更することもできます。

デフォルトでは、再帰的な構造を 1 つの Perl 文では構築できないという制約から、「 $VARn 」へのネストされたリファレンスは未定義になります。しかし、「 Purity 」フラグを 1 にしておけば、そのようなリファレンスも取得できます。

拡張した利用形式として、ダンプしたリファレンスにプレフィクス「 * 」を利用した任意の名前を指定することもできます。なお、「 Terse 」フラグがセットしていると、名前の出力は可能な限り回避されます。

メソッドはオブジェクト自体が内部の状態を返すものです。また、メソッド呼び出しは連鎖が可能です。


simple usage ( シンプルな用法 )



「 Data::Dumper 」のシンプルな利用方法を確認します。

次のコードは、3 つのパッケージ「 Foo 」, 「 Fuz 」, 「 main 」を利用して「 Data::Dumper 」によるデータ構造のダンプ結果を確認するものです。

まず、利用するパッケージと変数の初期化を行います。

パッケージ「 Foo 」と「 Fuz 」では、それぞれメソッド「 new 」を設定しています。パッケージ「 Fuz 」のデータ構造はややこしいものです。


use Data::Dumper;

package Foo;
sub new{ bless{ 'a'=>1,'b'=>sub{ return "foo" } },$_[0] };

# a weird REF-REF-SCALAR object
# 奇妙な REF-REF-SCALAR オブジェクト
package Fuz;
sub new{ bless{ \($_ = \'fu\'z'),$_[0] };

package main;
$foo = Foo->new;
$fuz = Fuz->new;
$boo = [
1,[],"abcd",\*foo,{1=>'a',023=>'b',0x45=>'c'}, \\"p\q\'r",$foo,$fuz
];



パッケージ「 main 」では、スカラ「 $foo 」にパッケージ「 Foo 」のオブジェクトを、スカラ「 $fuz 」にパッケージ「 Fuz 」のオブジェクトを格納しています。

加えて、スカラ「 $boo 」に無名配列リファレンスを格納していますが、ここで「 $foo 」と「 $fuz 」も 1 要素としてリストアップしていることに注目します。


pretty print (no array indices)



次のコードでは、配列リファレンスを格納したスカラ「 $boo 」と、そのデータ構造をダンプした結果を eval したものを格納したスカラ「 $bar 」を出力しています。



# 文字列 eval
$bar = eval(Dumper($boo));
print($@) if $@;

# pretty print (no array indices)
# なかなかな出力 ( 配列インデクスなし )
print Dumper($boo), Dumper($bar);



このコードを実行すると、「 $boo 」, 「 $bar 」ともに同じ内容を出力します。なお、デフォルトでは配列のインデクスは付加されません。


$VAR1 = [
1,
[],
'abcd',
\*::foo,
{
'69' => 'c',
'1' => 'a',
'19' => 'b'
},
\\'pq\'r',
bless( {
'a' => 1,
'b' => sub { "DUMMY" }
}, 'Foo' ),
bless( do{\(my $o = \'fuz\'z')}, 'Fuz' )
];
$VAR1 = [
1,
[],
'abcd',
\*::foo,
{
'69' => 'c',
'1' => 'a',
'19' => 'b'
},
\\'pq\'r',
bless( {
'a' => 1,
'b' => sub { "DUMMY" }
}, 'Foo' ),
bless( do{\(my $o = \'fuz\'z')}, 'Fuz' )
];




Terse = 1, Indent = 0



次のコードは、構成変数「 $Data::Dumper::Terse 」と「 $Data::Dumper::Indent 」を利用して名前の出力とインデントを操作しています。


# don't output name where feasible
# 名前を出力しない 可能なら
$Data::Dumper::Terse = 1;

# turn off all pretty print
# off にする すべての pretty print を
$Data::Dumper::Indent = 0;
print Dumper($boo), "\n";



このコードを実行すると、「 Terse = 1 」による名前の出力の抑制と、「 Indent = 0 」による改行・インデント等を削った最もコンパクトな出力が得られます。


[1,[],'abcd',\*::foo,{'69' => 'c','1' => 'a','19' => 'b'},\\'pq\'r',bless( {'a' => 1,'b' => sub { "DUMMY" }}, 'Foo' ),bless( do{\(my $o = \'fuz\'z')}, 'Fuz' )]



なお、「 Terse = 1 」による名前なしの出力は、eval による解析が失敗する場合があることに注意します。


Inden = 1



次のコードは、「 Indent 」によるインデントの操作をしていますが、値「 1 」を指定しているので、前項の値「 0 」と異なり、シンプルなインデントを付加します。


# mild pretty print
# マイルドな pretty print
$Data::Dumper::Indent = 1;
print Dumper($boo);



このコードを実行すると次の結果が得られます。


$VAR1 = [
1,
[],
'abcd',
\*::foo,
{
'69' => 'c',
'1' => 'a',
'19' => 'b'
},
\\'pq\'r',
bless( {
'a' => 1,
'b' => sub { "DUMMY" }
}, 'Foo' ),
bless( do{\(my $o = \'fuz\'z')}, 'Fuz' )
];




Indent = 3



次のコードは、「 Indent 」の値を「 3 」に設定しています。


# pretty print with array indices
# pretty print 配列インデクス付き
$Data::Dumper::Indent = 3;
print Dumper($boo);



「 Indent = 3 」は、デフォルトの値「 2 」と同じ形式ですが、配列のインデクス値をコメントとして付加します。


$VAR1 = [
#0
1,
#1
[],
#2
'abcd',
#3
\*::foo,
#4
{
'69' => 'c',
'1' => 'a',
'19' => 'b'
},
#5
\\'pq\'r',
#6
bless( {
'a' => 1,
'b' => sub { "DUMMY" }
}, 'Foo' ),
#7
bless( do{\(my $o = \'fuz\'z')}, 'Fuz' )
];



上記のとおり、配列インデクスは独立した行に追加されるので行数が 2 倍になります。


Useqq = 1



次のコードでは、「 $Data::Dumper::Useqq 」を利用して文字列のダブルクォートを指定しています。


# print strings is double quotes
# 出力する文字列は ダブルクォート
$Data::Dumper::Useqq = 1;
print Dumper($boo);



このコードを実行すると、次のように文字列として評価した部分をダブルクォート「 " 」でクォーテーションします。


$VAR1 = [
1,
[],
"abcd",
\*::foo,
{
69 => "c",
1 => "a",
19 => "b"
},
\\"pq'r",
bless( {
"a" => 1,
"b" => sub { "DUMMY" }
}, 'Foo' ),
bless( do{\(my $o = \"fuz'z")}, 'Fuz' )
];




Pair = " : "



次のコードでは、「 $Data::Dumper::Pair 」を利用して、ハッシュ key/value のセパレータを操作しています。


# specify hash key/value separator
# 指定する ハッシュ key/value のセパレータを
$Data::Dumper::Pair = " : ";
print Dumper($boo);



ここでは、セパレータを「 : 」に指定しているので、実行結果は次のようになります。


$VAR1 = [
1,
[],
'abcd',
\*::foo,
{
'69' : 'c',
'1' : 'a',
'19' : 'b'
},
\\'pq\'r',
bless( {
'a' : 1,
'b' : sub { "DUMMY" }
}, 'Foo' ),
bless( do{\(my $o = \'fuz\'z')}, 'Fuz' )
];



これは、JavaScript 向けのデータダンプに利用できるそうです。


NEXT



次回は、「 再帰的な構造体 」( recursive structures ) のダンプ方法を確認します。


参考情報は書籍「 続・初めての Perl 改訂版 」, 「 Effective Perl 第 2 版 」を中心に perldoc, Wikipedia および各 Web サイト。それと詳しい先輩。

目次 - Perl Index
























同じカテゴリー(Perl)の記事
 Perl mp2 翻訳 Web コンテンツ圧縮の FAQ (d228) (2023-10-11 23:49)
 Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227) (2023-05-26 15:41)
 Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226) (2023-05-19 17:05)
 Perl mp2 翻訳 テンプレートシステムの選択 (d225) (2022-08-15 22:23)
 Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224) (2022-06-15 20:43)
 Perl mp2 翻訳 チュートリアル (d223) (2022-06-15 20:42)
上の画像に書かれている文字を入力して下さい
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。

Llama
リャマ
TI-DA
てぃーだブログ
プロフィール
セラ (perlackline)
セラ (perlackline)
QRコード
QRCODE
オーナーへメッセージ

PAGE TOP ▲