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

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!
  • Comment on Re: Re: help needed on a foreach loop from hell!!!

Replies are listed 'Best First'.
Re: Re: Re: help needed on a foreach loop from hell!!!
by Ineffectual (Scribe) on Jan 24, 2002 at 06:24 UTC
    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!

        Yeah, I didn't realize that the code tags picked up the enters without needing html breaks, so I had to go back and delete them all. ;)
        'Fect
Re: Re: Re: help needed on a foreach loop from hell!!!
by theorbtwo (Prior) on Jan 24, 2002 at 05:43 UTC

    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