Re: YAML と YAML::Syck

レスポンスありがとうありがとう。

miyagawa 2008/12/17 08:25 $YAML::Syck::ImplicitUnicode = 1;

use strict;
use warnings;
use utf8;

use Test::More qw(no_plan);
use Encode;

use YAML;
use YAML::Syck;

my $yaml_flagged = <<__YAML__;
hoge:
  foo: ばー
  fuga: ふが
__YAML__

ok Encode::is_utf8($yaml_flagged), 'this is flagged';

# flagged なので真値に
local $YAML::Syck::ImplicitUnicode = 1;

my $dump_from_yaml     = YAML::Load($yaml_flagged);
my $dump_from_yamlsyck = YAML::Syck::Load($yaml_flagged);

is_deeply $dump_from_yaml, $dump_from_yamlsyck, 'flagged ok?';

my $yaml_bytes = encode( 'utf8', $yaml_flagged );

ok !Encode::is_utf8($yaml_bytes), 'this is bytes';

# bytes なので偽値に
local $YAML::Syck::ImplicitUnicode = 0;

$dump_from_yaml     = YAML::Load($yaml_bytes);
$dump_from_yamlsyck = YAML::Syck::Load($yaml_bytes);

is_deeply $dump_from_yaml, $dump_from_yamlsyck, 'bytes ok?';

結果

通った!

[vkgtaro@finalsparc.local] $ perl test_yaml.pl
ok 1 - this is flagged
ok 2 - flagged ok?
ok 3 - this is bytes
ok 4 - bytes ok?
1..4

今度から YAML::Syck で flagged / bytes を適宜変えたければ Encode::is_utf8 みて、$YAML::Syck::ImplicitUnicode の真偽を変えますー。