in reply to Manipulating Arrays

I don't understand what your code is trying to do, neither from your code nor from your description. Can you please look at the following list and expand it so we have a common understanding of what the code is supposed to do?

  1. Read file FILE_LAST_MOD_DIR to get a list of directories to look in
  2. While we have directories in that list do:
    1. For each directory, look if there is a file with the name matching *END*.txt
    2. If such a file exists, remove that file from the FILE_LAST_MOD_DIR and our list.

If the above description is correct, then consider using Tie::File to treat a line-oriented file just like an array. For removing files, see unlink, not delete. You will also likely want to use the File::Glob::bsd_glob function instead of the find program.

For your coding style, please don't use C-style for loops. They are almost always an error. It's better to use the foreach-style of loops.

You haven't told us what the output of your program is and where it enters into an infinite loop. If you would provide a self-contained example that does not rely on a specific directory structure and specific files, that would help us replicate your problem and then we could help you better with your concrete problem.

Replies are listed 'Best First'.
Re^2: Manipulating Arrays
by shekarkcb (Beadle) on Jun 12, 2009 at 08:19 UTC
    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

      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.