Data::Dump サンプルコード
どこからか拾いました。参照元を紛失orzアンテナに登録したはずなんですが、どれだっけorz
#!/usr/bin/perl -w use strict; use warnings; use Data::Dump; eval{ open(IN, './test.xml'); my $xml = join('', <IN>); close(IN); @_ = &xml_to_array($xml); print Dumper([@_]); }; if( $@ ){ print "Exception : $@\n"; } sub xml_to_array { my $xml = shift; my $tag_regex_ = q{<[^"'<>]*(?:"[^"]*"[^"'<>]*|'[^']*'[^"'<>]*)*(?:>|(?=<)|$(?!\n))}; my $comment_regex = '<!(?:--[^-]*-(?:[^-]+-)*?-(?:[^>-]*(?:-[^>-]+)*?)??)*(?:>|$(?!\n)|--.*$)'; my $cdata_regex = q{<!\[CDATA\[.*?(:?\]\]>|$(?!\n))}; my $tag_regex = qq{$cdata_regex|$comment_regex|$tag_regex_}; my $text_regex = q{[^<]*}; my @result; while ($xml =~ /($text_regex)($tag_regex)?/gso) { my ($text, $tag) = ($1, $2); last if ($text eq '' && $tag eq ''); push (@result, grep {$_ ne ''} ($text, $tag)); } return @result; } 1; __END__
Data::Dumpというより、↓を使えばOpen-Closeの競合が回避できる?
open(IN, './test.xml'); my $xml = join('', <IN>); close(IN);
う〜ん…