Beefy Boxes and Bandwidth Generously Provided by pair Networks
more useful options
 
PerlMonks  

How to get file path into hash data structure.

by veerubiji (Sexton)
on Dec 14, 2011 at 14:09 UTC ( [id://943556]=perlquestion: print w/replies, xml ) Need Help??

veerubiji has asked for the wisdom of the Perl Monks concerning the following question:

Hi monks, I have some xml files in a directory , so I am searching required xml files in that directory and storing xml data in a hash data structure using below script. But my problem is I need to save the file path of each xml file in the hash But Can any one help me how to save file path in hash data

I written script like this

#!/usr/bin/perl use warnings; use strict; use XML::Simple; use Carp; use File::Find; use File::Spec::Functions qw( canonpath ); use Data::Dumper; my @ARGV ="C:/Main/work"; die "Need directories\n" unless @ARGV; find( sub { return unless ( /(_service\.xml)$/ and -f ); Hash_information(); return; }, @ARGV ); sub Hash_information { my $path= $_; my $xml = new XML::Simple; my $data = $xml->XMLin("$path", ForceArray => [ 'Service','SystemReact +ion','SW','HW','Component' , 'BM'], KeyAttr=>{Service=>'Id'} ); print Dumper ($data); return; }

using above script I am getting all service xml files form folder and using XML::Simple storing in a hash data structure. Now I want to save file path of each xml file in the hash data structure. Can any one help me.

Thanks in advance

Replies are listed 'Best First'.
Re: How to get file path into hash data structure.
by Marshall (Canon) on Dec 14, 2011 at 14:23 UTC
    The find() subroutine has no way to pass information back out of it. Define a %hash with larger scope than the find() routine and have the find routine add hash keys,values to that %hash.

    BTW:

    my @ARGV ="C:/Main/work"; die "Need directories\n" unless @ARGV;
    this makes no sense. @ARGV is a Perl defined array. It contains the command line arguments. This is not a thing for you to define as a "my" variable.
    my $default_dir = "C:/Main/work"; if (@ARGV == 1) { $default_dir = shift @ARGV ) elsif (@ARGV >1) { die "too many command line args\n"; }; # $default_dir remains in effect if there was not # exactly one command line argument

      Hi Marshall, Thanks for your reply and suggestion. I tried as you said as shown below

      #!/usr/bin/perl use warnings; use strict; use XML::Simple; use Carp; use File::Find; use File::Spec::Functions qw( canonpath ); use Data::Dumper; my %hash; my $default_dir = "C:/Main/work"; if (@ARGV == 1) { $default_dir = shift @ARGV ) elsif (@ARGV >1) { die "too many command line args\n"; }; find( sub { return unless ( /(_service\.xml)$/ and -f ); Hash_information(); return; }, @ARGV ); sub Hash_information { my $path= $_; my $xml = new XML::Simple; my $data = $xml->XMLin("$path", ForceArray => [ 'Service','SystemReact +ion','SW','HW','Component' , 'BM'],); return; }

      I don't know how to add file path to hash? and also you suggested me define one hash with larger scope so I defined one hash and I don't know how to store this $data into %hash. Can you help me. Don't hesitate me I am new to perl.

        Ok does this make sense?:
        #!/usr/bin/perl use warnings; use strict; use XML::Simple; use Carp; use File::Find; use Data::Dumper; my %hash; my $default_dir = "C:/Main/work"; if (@ARGV == 1) { $default_dir = shift @ARGV ) elsif (@ARGV >1) { die "too many command line args\n"; }; find (\&process_file_name, $default_dir); # find() will start at the $default_dir # and call process_file_name for each file or # directory that it finds at or "beneath" the # $default_dir sub process_file_name { my $current_file = $File::Find::Name; #$File::Find::name is the complete pathname to the file. return unless (-f $current_file and $current_file =~ /_service\.xml$/); # we are at a data file (not a directory) # and this file name ends in _service.xml process_the_file ($current_file); } sub process_the_file { my $file_path = shift; ...open the $file_path ...figure out what you want from that file... ...$hash{$file_path} = "some data"; # this is how the data is "returned" # %hash has "global scope" # add an entry to %hash instead of # returning a value from this sub ...close the file }

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others pondering the Monastery: (7)
As of 2024-04-19 10:52 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found