#!perl -w ; use strict ; use warnings ; use Data::Dumper ; use Test::More tests => 23 ; use IO::Util qw(load_mml) ; my $str1 = << 'EOS' ignored text 01 ignored text 02 ignored text 05 03 04 06 EOS # defaults ; my $r1 = load_mml \$str1, strict=>0 # ; warn Dumper $r1 ; is_deeply $r1 , { a => [ '01' , '02' , '03' , '04' ] , b => { c => '05' } , d => '' , e => '06 ' } # keep_root option ; my $r2 = load_mml \$str1, keep_root=>1, strict=>0 # ; warn Dumper $r2 ; is_deeply $r2 , { opt => { a => [ '01' , '02' , '03' , '04' ] , b => { c => '05' } , d => '' , e => '06 ' } } # strict option ; my $str2 = << 'EOS' 01 02 05 EOS ; my $r3 = load_mml \$str2 #; warn Dumper $r3 ; is_deeply $r3 , { a => [ '01' , '02' ] , b => { c => '05' } } ; eval{ load_mml \ 'garbage01' } #' ; ok $@ ; eval{ load_mml \'01' } #' ; ok $@ ; eval{ load_mml \'01' } #' ; ok $@ # data_filter option ; my $str3 = << 'EOS' abc def ghi d e f EOS ; my $r4 = load_mml \$str3 #; warn Dumper $r4 ; is $$r4{a}, "\n abc\n" ; my $r5 = load_mml \$str3, filter => {qr/./=>'ONE_LINE'} #; warn Dumper $r5 ; is $$r5{a}, ' abc ' ; my $r6 = load_mml \$str3, filter => {qr/./=>\&IO::Util::TRIM_BLANKS} #; warn Dumper $r6 ; is $$r6{b}, "def\nghi" ; my $r7 = load_mml \$str3, filter => {qr/./=>\&trim_and_one_line} #; warn Dumper $r7 ; sub trim_and_one_line { IO::Util::TRIM_BLANKS() ; IO::Util::ONE_LINE() } ; is $$r7{b}, "def ghi" ; my $r8 = load_mml \$str3, filter => { qr/./ => sub{ trim_and_one_line() ; uc } } #; warn Dumper $r8 ; is $$r8{b}, "DEF GHI" # element_handler option # change options ; my $r9 = load_mml \$str3, filter => { qr/d|e/ => sub{uc} } #; warn Dumper $r9 ; is $$r9{c}{d}, "D" ; is $$r9{c}{e}, "E" ; is $$r9{f}, "f" ; my $r10 = load_mml \$str3, handler => { c => \&c_struct_change } # structure change ; sub c_struct_change { my $str = IO::Util::parse_mml(@_) ; [ sort values %$str ] } #; warn Dumper $r10 ; is_deeply $$r10{c}, [ 'd', 'e' ] # skip element ; my $r11 = load_mml \$str3 , handler => {c=>sub{}} #; warn Dumper $r11 ; ok not defined $$r11{c} # object creation ; my $r12 = load_mml \$str3, handler => {c=>\&c_obj} ; sub c_obj { my $str = IO::Util::parse_mml(@_) ; bless $str, 'My::Class' } #; warn Dumper $r12 ; isa_ok $$r12{c}, 'My::Class' # matrix with folding ; my $str4 = << 'EOS' 01 02 03 04 EOS ; my $r13 = load_mml \$str4, handler => { a => \&a_struct_change } ; sub a_struct_change { my $str = IO::Util::parse_mml(@_) # folding 'b' ; $$str{b} } #; warn Dumper $r13 ; is_deeply $r13 , { a => [ [ '01' , '02' ] , [ '03' , '04' ] ] } # escape/unescape ; my $str5 = << 'EOS' \01\ \01\ \\\\ EOS ; my $r14 = load_mml \$str5 #; warn Dumper $r14 ; is_deeply $r14 , { a => '01' , b => '01' , c => '\' } # comments ; my $str6 = << 'EOS' 01 EOS ; my $r15 = load_mml \$str6 #; warn Dumper $r15 ; is $$r15{a}, '01' ; is $$r15{b}, undef ; my $str7 = << 'EOS' 01 02 EOS ; my $r16 = load_mml \$str7 #; warn Dumper $r3 ; is_deeply $r16 , { a_b => '01' , a => '02' } ; my $str8 = << 'EOS' 01 02 03 EOS ; my $r17 = load_mml \$str8 , handler => { a => 'SPLIT_LINES' } , filter => { a => 'TRIM_BLANKS' } ; is_deeply $r17 , { a => ['01', '02', '03' ] }