Perl YAML模块无法识别标量的类型



i加载以下.yaml文件

foo : bar
s : 1
hx: 0x34

使用此代码:

use YAML qw(LoadFile Dump); 
use Data::Dumper; 
my $d=LoadFile("test.yaml"); 
print Dumper($d);
print "x        =", $d->{hx},"n";
print "x/2      =", $d->{hx}/2,"n";
print "hex(x)/2 =", hex($d->{hx})/2,"n";

,输出为

Output:
> ./yaml.pl
$VAR1 = {
          'foo' => 'bar',
          'hx' => '0x34',
          's' => '1'
        };
x        =0x34
x/2      =0
hex(x)/2 =26

这意味着它将所有标量视为字符串,我没想到。从CPAN的YAML文档http://metacpan.org/pod/yaml我假设这是通过隐式标记来处理的,并且模块可以识别十六进制号。

有人知道该怎么做吗?

如果您检查了加载程序类,您会发现_parse_inline Sub具有一些分支,用于序列,映射,单个和双引号的字符串以及其他一些情况。您需要做的就是添加一个以0x开头的值。我写了那个分支机构和一个用于处理YAML 0.900.0的十六进制值的潜艇。我尝试了一些基本的输入,并且似乎可以做您想要的。如果也适合您,请考虑提交补丁。

dump.pl

use YAML qw(LoadFile Dump); 
use Data::Dumper; 
my $d=LoadFile("test.yaml"); 
$d=LoadFile("test.yaml"); 
print Dumper($d);
print "x        =", $d->{hx},"n";
print "x/2      =", $d->{hx}/2,"n";
print "hex(x)/2 =", hex($d->{hx})/2,"n";

$d=LoadFile("sym1.yaml"); 
print Dumper($d);
print "dodo[4]  =", $d->{dodo}->{doto}[4], "n";
print "dodo[3]  =", $d->{dodo}->{doto}[3], "n";

sym1.yaml

"symfony 1.0":
  PHP:    5.0
  Propel: 1.2
"symfony 1.2":
  PHP:    5.2
  Propel: 1.3
dodo:
  doto: [1,23,4, 0x34, 0x16 ]
  dozo: [1,23,4, 0x12, 0x11 ]
  dofo: { a: 2,  358: 0x166, 255: 0xff, 255: 0xFF}
ffa: 0xFfA

$ PERL DUMP.PL

$VAR1 = {
          'foo' => 'bar',
          'hx' => 52,
          's' => '1'
        };
x        =52
x/2      =26
hex(x)/2 =41
$VAR1 = {
          'ffa' => 4090,
          'symfony 1.2' => {
                           'PHP' => '5.2',
                           'Propel' => '1.3'
                         },
          'dodo' => {
                    'dofo' => {
                              'a' => '2',
                              '255' => 255,
                              '358' => 358
                            },
                    'dozo' => [ '1','23', '4', 18, 17 ],
                    'doto' => [ '1', '23', '4', 52, 22 ]
                  },
          'symfony 1.0' => {
                           'PHP' => '5.0',
                           'Propel' => '1.2'
                         }
        };
doto[4]  =22
doto[3]  =52

yaml 0.900.0

的补丁
diff --git a/Loader.pm b/Loader.pm
index 3bf20c7..d7096df 100644
--- a/Loader.pm
+++ b/Loader.pm
@@ -437,6 +437,10 @@ sub _parse_inline {
         $node = $self->_parse_inline_single_quoted();
         $node = $self->_parse_implicit($node) if $implicit;
     }
+    elsif ($self->inline =~ /^0x/) {
+        $node = $self->_parse_inline_single_hex();
+        # do something if implicit?
+    }
     else {
         if ($top) {
             $node = $self->inline;
@@ -541,6 +545,21 @@ sub _parse_inline_single_quoted {
     return $node;
 }
 
+# Parse the inline hex value
+sub _parse_inline_single_hex {
+    my $self = shift;
+    my $node;
+    if ($self->inline =~ /^0x([A-Fa-f0-9]+)(,?.*)?$/) {
+        $node = hex($1);
+        $self->inline($2);
+        $node =~ s/''/'/g;
+    }
+    else {
+        $self->die('YAML_PARSE_ERR_BAD_HEX');
+    }
+    return $node;
+}
+
 # Parse the inline unquoted string and do implicit typing.
 sub _parse_inline_simple {
     my $self = shift;

相关内容

最新更新