in reply to Re^3: array of hashes help
in thread array of hashes help

thank you so much for your help and do very much appreciated

The problem is that my input files are XML and I have to search for multiple lines

Here is my entire code, I have removed many of values from @myHashArray and just left one item

#!/usr/bin/perl ############### ## Libraries ## ############### use File::Copy; use File::Find; use File::Path; use File::Basename; use File::stat; use strict; use warnings; use Time::localtime; ################## ## User-defined ## ################## #--check for rptCustomAssembly word my $find = "CustomAssembly"; #--the root location of files to start reading (this can be our ShareP +oint site) my $rootLocationOfFiles = 'C:\rptTest'; #--the name and location of log file my $logFile = '>C:\rptDest\logRptFindAndReplace.txt'; #--get the start timestamp my $currentTime = time; #--Open a logfile to write the file names open (LOGFILE, $logFile); #--get current timestamp my $startTimeStamp = '[' . timestamp() . ']'; #--write to our logfile print LOGFILE "------------------------------------------------------- +------------\n"; print LOGFILE "Start time: $startTimeStamp\n"; print LOGFILE "Please Note:\n"; print LOGFILE "List of reports that are modified by script.\n"; print LOGFILE "------------------------------------------------------- +------------\n\n"; #----------------------------------------------------- #--Find and replace $source with $target if CustomAssembly is not refe +renced in report file my $source = '<Language>en-US</Language>'; my $target = '<Language>en-US</Language> <CodeModules> <CodeModule>CustomAssembly, Version=1.0.0.1, Culture=neutral, Publ +icKeyToken=null</CodeModule> </CodeModules>'; use File::Find qw(finddepth); my @files; my $counter = 0; my @myHashArray = ( {toFind => '<Image Name="Logo"> <Source>Embedded</Source>', toReplace => '<Image Name="Logo"> <Source>External</Source>' } ); #--END @myHashArray finddepth(sub { return if($_ eq '.' || $_ eq '..'); my ($dir, $name, $ext) = fileparse($File::Find::name,'.rdl'); my $fileName = $_; chop($name); my $fullFileName = "$name\\$fileName"; my $Dest = "$rootLocationOfFiles\\$fileName"; #--read only .rdl files if($ext eq '.rdl') { my $data = read_file($File::Find::name); for ($data) { if ($_ !~ /$find/) { $data =~ s/$source/$target/g; $data =~ s/$_->{toFind}/$_->{toReplace}/g foreach (@myHash +Array); write_file($File::Find::name, $data); #--write to the fi +le print LOGFILE "$counter $File::Find::name\n"; print LOGFILE "\t Original line: HERE WOULD BE MY ORIGINAL + LINE\n"; print LOGFILE "\t Replaced Line: HERE WOULD BE THE NEW LIN +E\n"; print "$counter $File::Find::name\n"; $counter = $counter + 1; #system("copy \"$fullFileName\" \"$Dest\""); #--copy fil +es } else { $counter = $counter + 1; $data =~ s/$_->{toFind}/$_->{toReplace}/g foreach (@myHash +Array); write_file($File::Find::name, $data); print LOGFILE "$counter $File::Find::name\n"; print LOGFILE "\t Original line: HERE WOULD BE MY ORIGINAL + LINE\n"; print LOGFILE "\t Replaced Line: HERE WOULD BE THE NEW LIN +E\n"; print "$counter $File::Find::name\n"; #print "$_->{toFind} : $_->{toReplace}\n" foreach (@myHash +Array); } } } }, $rootLocationOfFiles); my $endTimeStamp = '[' . timestamp() . ']'; my $totalSeconds = time - $currentTime; my $totalMins = ($totalSeconds/60)%60; my $totalSec = $totalSeconds%60; print LOGFILE "------------------------------------------------------- +------------\n"; print LOGFILE "\n"; print LOGFILE "Program ended at: $endTimeStamp\n"; print LOGFILE "It took $totalMins minute(s) and $totalSec seconds\n"; print "DONE, it took $totalMins minute(s) and $totalSec seconds\n"; close (LOGFILE); #----------------------------------------------------- #--Read the file sub read_file { my ($filename) = @_; open my $in, '<:encoding(UTF-8)', $filename or die "Could not open + '$filename' for reading $!"; local $/ = undef; my $all = <$in>; close $in; return $all; } #----------------------------------------------------- #--Write the file back sub write_file { my ($filename, $content) = @_; open my $out, '>:encoding(UTF-8)', $filename or die "Could not ope +n '$filename' for writing $!";; print $out $content; close $out; return; } #----------------------------------------------------- #--get timestamp sub timestamp { my $t = localtime; return sprintf( "%04d-%02d-%02d at %02d:%02d:%02d", $t->year + 1900, $t->mon + 1, $t->mday, $t->hour, $t->min, $t->sec ); } #-----------------------------------------------------