in reply to Forcing to anonymous array in XML::simple

The problem you are having is the element you are forcing to an array (A) is an array. But you're wanting ForceArray to cascade down to the children of A. Since the first element of A is a ref, it is unnamed and XML::Simple says it only takes names (or '1') in the ForceArray option.

You need to turn on ForceArray for the entire thing

use strict; use warnings; use XML::Simple;use Data::Dumper; my $file = './test.xml'; my %tmp = ( 'A' => [ [1] ]); XMLout(\%tmp,outputfile=>$file); %tmp = %{XMLin($file,forcearray=>1}; warn Dumper(\%tmp); %tmp = ( 'A' => [ [1,2] ]); XMLout(\%tmp,outputfile=>$file); %tmp = %{XMLin($file,forcearray=>1)}; warn Dumper(\%tmp);
Outputs:
$VAR1 = { 'A' => [ [ '1' ] ] }; $VAR1 = { 'A' => [ [ '1', '2' ] ] };

grep
1)Gain XP 2)??? 3)Profit

Replies are listed 'Best First'.
Re^2: Forcing to anonymous array in XML::simple
by rbi (Monk) on Dec 14, 2006 at 16:47 UTC
    Thank you.
    I have one more question. I tested more pairs in the hash and the option noattr=>1 (that I realized I need to use). When I run:
    use strict; use warnings; use XML::Simple;use Data::Dumper; my $file = './test.xml'; my %tmp = ( A => [ [1] ], B => 1); XMLout(\%tmp,outputfile=>$file,noattr=>1); %tmp = %{XMLin($file,forcearray=>['A'],noattr=>1)}; warn Dumper(\%tmp); %tmp = %{XMLin($file,forcearray=>1,noattr=>1)}; warn Dumper(\%tmp);
    I get:
    $VAR1 = { 'A' => [ { 'anon' => '1' } ], 'B' => '1' }; $VAR1 = { 'A' => [ [ '1' ] ], 'B' => [ '1' ] };
    is it correct that I cannot get A value as array and B value as scalar ?, i.e.:
    $VAR1 = { 'A' => [ [ '1' ] ], 'B' => '1' };
      Yes, B will also be forced into a 1 element array (with ForceArray => 1). But IMO that is the way it should be. It's consistant.

      grep
      1)Gain XP 2)??? 3)Profit

        Thanks. I'm trying to cope in a general way with these situations:
        use strict; use warnings; use XML::Simple;use Data::Dumper; my $file = './test.xml'; my $a = ['x','y']; my $a1 = [$a]; my %tmp = ( A =>$a1, B => 'z'); XMLout(\%tmp,outputfile=>$file,noattr=>1); %tmp = %{XMLin($file,forcearray=>['A'],noattr=>1)}; print "----------\n"; print $tmp{B}."\n"; print $tmp{A}[0]->[0]."\n"; $a = ['x']; $a1 = [$a]; %tmp = ( A =>$a1, B => 'z'); XMLout(\%tmp,outputfile=>$file,noattr=>1); %tmp = %{XMLin($file,forcearray=>1,noattr=>1)}; print "----------\n"; print $tmp{B}."\n"; print $tmp{A}[0]->[0]."\n"; $a = ['x']; $a1 = [$a]; %tmp = ( A =>$a1, B => 'z'); XMLout(\%tmp,outputfile=>$file,noattr=>1); %tmp = %{XMLin($file,forcearray=>['A'],noattr=>1)}; print "----------\n"; print $tmp{B}."\n"; print $tmp{A}[0]->[0]."\n";
        That outputs:
        ---------- z x ---------- ARRAY(0x653930) x ---------- z Not an ARRAY reference at tmp1.pl line 31.
        I can only think of evaluating ref($tmp{A}) and ref($tmp{B}) to decide how to operate, since in my code $tmp{A} is an array reference to an array that can have a single element made by an array reference to a single-element array itself, and $tmp{B} is instead a scalar. I guess I'm missing something...