On Jan 9, Parker, Robin said:

>foreach @array_of_files
>{
>       unless (-r $_ && -w $_)
>       {
>               print"***Error : Cannot find file $_\n";
>       }
>       OPEN(FILE, $_) or die etc.......

This code doesn't work -- if you're going to write code, please make sure
you've checked it.

>       while (<FILE>)
>       {
>               /^\b$word\b/ && $wordfound++;
>       }
>       close (FILE);
>       unless ($wordfound)
>       {
>               print"*** Error : word not found in file $_\n";
>       }
>       $wordfound = 0;
>}

>Now I understand that this won't work 'cause while will kill off foreach's
>$_.  However, I tried something with a variable called $storage.
>
>I added it in here...
>
>       $storage = $_;
>       while(<FILE>) {
>       }
>       $_ = $storage;
>       close (FILE);

The more common approach would be:

  for $file (@list_of_files) {
    open FILE, $file;
    while (<FILE>) { ... }
    close FILE;
  }

That way, $file holds the filename, and $_ holds each line.

>My second foreach loop then complains of my using uninitialised values.  So
>I put in a print "@array_of_files\n"; after the first foreach loop.
>
>It's empty.
>
>OK, so while overwrote $_ but why does this delete the contents of
>@array_of_files?

Because $_ is an alias to the element in the array.  Watch:

  @n = (1 .. 3);
  for (@n) {
    $_ *= 2;
  }
  print "@n\n";  # 2 4 6

See?  Now, when using while (<FILE>), Perl expands that to the more
"proper" while (defined($_ = <FILE>)).  When the file is done being read,
<FILE> returns undef, and the loop stops.  That means that $_ has been set
to undef, and since $_ is actually the element of the filename array,
you've just trashed that element.

>How do I stop while messing things up?  Something to do with 'local' isn't
>it??

It could, but the better approach is to not use $_ in many different
environments at once.
-- 
Jeff "japhy" Pinyan      [EMAIL PROTECTED]      http://www.pobox.com/~japhy/
RPI Acacia brother #734   http://www.perlmonks.org/   http://www.cpan.org/
** Look for "Regular Expressions in Perl" published by Manning, in 2002 **
<stu> what does y/// stand for?  <tenderpuss> why, yansliterate of course.


-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to