Beefy Boxes and Bandwidth Generously Provided by pair Networks
Don't ask to ask, just ask
 
PerlMonks  

Forcing to anonymous array in XML::simple

by rbi (Monk)
on Dec 14, 2006 at 15:26 UTC ( #589844=perlquestion: print w/ replies, xml ) Need Help??
rbi has asked for the wisdom of the Perl Monks concerning the following question:

Hello,
This code:
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=>['A'])}; warn Dumper(\%tmp); %tmp = ( 'A' => [ [1,2] ]); XMLout(\%tmp,outputfile=>$file); %tmp = %{XMLin($file,forcearray=>['A'])}; warn Dumper(\%tmp);
outputs:
$VAR1 = { 'A' => [ { 'anon' => '1' } ] }; $VAR1 = { 'A' => [ [ '1', '2' ] ] };
How do I force the value of key A to be an array of array also in the first case ?
Thank you.

Comment on Forcing to anonymous array in XML::simple
Select or Download Code
Re: Forcing to anonymous array in XML::simple
by grep (Monsignor) on Dec 14, 2006 at 15:54 UTC
    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

      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

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://589844]
Approved by Joost
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others rifling through the Monastery: (2)
As of 2014-09-15 04:28 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    My favorite cookbook is:










    Results (145 votes), past polls