in reply to Re: Manipulating Arrays
in thread Manipulating Arrays

Hi Corion,

Thanks for reply. Yes i will use foreach loop.My input is a file with all the entries, for eg:

/home/shekarkcb/abc/ /home/shekarkcb/def/ /home/shekarkcb/abc/
I got to do these things

1)Read Each entry from file, go to that folder, find *END*txt. if found then delete a entry from file.
2)If not found then do a next till finds *END*txt.

I have used Arrays for these.
-> First open file, put all entry in an array.
-> while array (@array_LAST_MOD_FILE) length not equals to 0, for each of that entry (used c style for loop as you mentioned) i.e for each directory used find to 'find' the file *END*txt, and stored result in an array.
-> Again checking the length of it is 0 means no result obtained (no END file),
if not 0 then yes got END file inside that directory so delete the entry from @array_LAST_MOD_FILE,

Here is what the problem, i will delete the entry here, but outer while still has the entry.so it is going to infinite. Hope now you got the problem. Please suggest me a soln or a better way to do this.

Thanks,ShekarKCB

Replies are listed 'Best First'.
Re^3: Manipulating Arrays
by Corion (Patriarch) on Jun 12, 2009 at 08:28 UTC

    Tie::File will solve your problem of keeping a file and an array in sync. But you could also just write out the new array at the end of your program, instead of rewriting the file every time. delete does not what you think it does.

    If you're waiting for a file *END*.txt to appear, you should sleep to give the other program some CPU to do its work.

    I'm not sure why or where you have an inner and an outer @array_LAST_MOD_FILE, but I think the main problem of your loop is that delete does not do what you think it does. Removing elements from a list while iterating over that list is always problematic, so I would avoid that in your place and instead create a new list of things to keep, and at the end replace the old list with the new list. This approach works with both, the C-style loop and the foreach-style.

      Hi All

      Thank you all for your help. I found out a way thereby i need not to play around with array but a simple variable (scalar) will give out my results. Here is how i proceeded. i just added a tag '<entry>' around my file entries and matching the same in while.

      open(F,"FILE_LAT_MOD_DIR") or die $!; @array_LAST_MOD_FILE=<F>; close(F); my $str_file=join("",@array_LAST_MOD_FILE); while($str_file =~ m/<entry>(.*?)<\/entry>/i) { my $match=$1; chomp($match); my @arr_find=`find \"$match\" -iname *END*.txt -type f +`; my $length=@arr_find; print "LENGTH OF THE ARRAY=$length|\n"; if($length eq 0) { sleep(1); next; } else { print "SEEMS for |$match| END.txt PRESENT....D +eleting from string..\n"; $str_file=~s/<entry>$match<\/entry>//is; } }

      Anyway thanks once again for you guys help.Hence closing the post
      Thanks,
      ShekarKCB.