YAML と YAML::Syck

YAML.pm は Load 対象が flagged だと flagged になるけど、
YAML::Syck は Load 対象が flagged でも bytes になる

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

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

$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
not ok 2 - flagged ok?
#   Failed test 'flagged ok?'
#   at test_yaml.pl line 22.
Wide character in print at /opt/local/lib/perl5/5.8.8/Test/Builder.pm line 1334.
#     Structures begin differing at:
#          $got->{hoge}{fuga} = 'ふが'
#     $expected->{hoge}{fuga} = 'ã&#181;ã'
ok 3 - this is bytes
ok 4 - bytes ok?
1..4
# Looks like you failed 1 test of 4.