in reply to help needed on a foreach loop from hell!!!

Which foreach isn't working? The foreach $line2 (@file) or the foreach $word2 (@word2)? I did a few tests on my own, but without knowing what data you're searching through with the EditorCommand part, I'm not sure if it's your assignment of word2 into the array or if it's something further down. Correct assignment of an array usually utilizes push ie:  push(@word2, $1). The next thing to do is to print @word2 and $pattern to see if they're being assigned. Also, I'm not sure why your sub is in the middle of your code rather than at the bottom or why the $found is at the bottom of the script. It might help to post a snippet of the files that you're trying to parse.
'Fect
YMMV

Replies are listed 'Best First'.
Re: Re: help needed on a foreach loop from hell!!!
by Kentdn (Novice) on Jan 24, 2002 at 05:21 UTC
    Thanks for your suggestions and the part that isn't working is the "foreach $line2". I think what is going wrong is that the code is overwriting the first position in the array, so I guess the question is how to I increment the scalar so it writes to a new position in the array? Also thanks for the general perl comments, I am really new to this and am trying to learn as much as I can as fast as I can; all the comments are a big help!
      Hopefully this isn't offensive, but personally I'd rewrite your code as:
      print "Enter file name and path of .ins to parse:\n"; my $filename1 = <STDIN>; die "File $filename1 does not exist\n" unless (-e $filename1); print "Enter file name and path of .rcs to search:\n";<br> my $filename2 = <STDIN>; die "File $filename2 does not exist\n" unless (-e $filename2); open (FILE, "<$filename1) or die "Can't open file $filename1 :$!\n"; my @file = <FILE>; close FILE; foreach my $line (@file) {
      Depending on what you're parsing here, I'd probably use a split rather than $1. YMMV.
      ie: If file line was "EditorName Susan Hammel" I'd do
      if ($line =~ /EditorName/) { my @name = split(/\s+/, $line); my $first = $name[1]; my $last = $name[2]; } foreach my $line2 (@file) { if ($line2 =~ /EditorCommand/) { my @commands = split(/s+/, $line2); shift @commands; # To remove the EditorCommand - Requires line that +looks like "EditorCommand print paste copy" } open (OUTPUT, ">>test.txt"); foreach my $com (@dcommands) { my $pattern = $word1 . ":" . $com; my $test = in_file($pattern, $filename2); if ($test) { print OUTPUT "Found $pattern in $filename2 \n"; } else { print "$pattern not in $filename2 \n"; } } exit; #### SUBS #### sub in_file { my $pattern = shift; my $filename2 = shift; open INFILE, $filename2 or die "Can't open $filename2: $!\n"; my $found = 0; while (<INFILE>) { if (/$pattern/) { $found = 1; last; } close FILE; return $found; }
      HTH, YMMV
      'Fect
        One **tiny** correction: you've got an HTML break tag ('<br>') at the end of the 4th line:

           print "Enter file name and path of .rcs to search:\n";<br>

        That <br> tag doesn't belong in the code. Sorry if I'm nitpicking too much, but if Kentdn is looking for perl problems the last thing he needs is an extra bit of formatting thrown in :)

        Good luck Kentdn!

      You'd indeed be correct about "@word2=$1" overwritting the first position of @word2. To whit, at assigns @word2 to the list consisting of the single element $1. As Ineffectual noted, the best way to do what you want here is generaly with a push, push @word2, $1; in this case. (BTW, following that push link will get you the same thing (more or less, depending on what version of perl you've got installed) as "perldoc -f push" from a command prompt. (If you're running ActiveState perl for win32, there's also a perlfunc.html sitting around that has the same thing in html form.)

      If you don't have it yet, BTW, I highly recommend "Programming Perl", AKA The Camel Book. Your library /should/ have it.

      TACCTGTTTGAGTGTAACAATCATTCGCTCGGTGTATCCATCTTTG ACACAATGAATCTTTGACTCGAACAATCGTTCGGTCGCTCCGACGC