ねもぷらす

ふぁいんでぃんぐねもの日記。プログラミングとか育児とか

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);

う〜ん…