in reply to Until there's nothing but spaces?

O.K. this is how I solved it, it seems to work pretty well. Tnx to all for their help!
opendir (ID, "$dir"); @dirlist = readdir(ID); closedir(ID); foreach $inode (@dirlist) { $i++; print "Files processed: $i\n"; next if $inode =~ /^\./; my $sfile = $dir . $inode; open (IF, "<$sfile"); @fcont = (<IF>); close (IF); open (OF, ">$sfile"); foreach $line (@fcont) { if ($line =~ /themark/) { print "starter string found\n"; $flag = 1; next; } if ($flag == 1) { if (!($line =~ /\w+/)) { $flag = 0; next; } else { print OF $line; } } } close (OF); }

Replies are listed 'Best First'.
Re: Until there's nothing but spaces?
by mandog (Curate) on Oct 01, 2001 at 06:40 UTC
    next if $inode =~ /^\./;
    ...looks like it will match .bashrc .login .hidden_data and skip them.

    If you only want to skip '..' and '.' something you may want something (untested) like this:

    m/^\.{1,2}$/


    --mandog

      Good thing you pointed out that this code is untested, because it is wrong! Someone posted this very same snippet a couple of weeks ago and merlyn pointed out a subtle way in which it can fail.

      But rather than elaborating a more and more complex regexp for such a simple operation, I like to spell things out more simply, but using something like:

        next if $inode eq '.' or $inode eq '..';

      This avoids pulling in the regexp machinery, and is much easier for the next maintainer (who may not be as good a rexexp wizard as yourself) to figure out what is going on.

      --
      g r i n d e r
        Esteemed Sibling Grinder:

        Here you write "Good thing you pointed out that this code is untested, because it is wrong!" ....

        Thank you for your correction. At first I doubted you and the saint who's words you invoked.

        The correct regular expression is:
         /\A\.{1,2}\z/ My regular expression was:

        /^\.{1,2}$/ <code> perldoc perlre
        reads in part:
        ...The \A and \Z are just like ``^'' and ``$'', except that they won't match multiple times when the /m modifier is used, while ``^'' and ``$'' will match at every internal line boundary. ...

        Since there is no /m modifier in the picture I doubted you....

        However,  perldoc perlre continues:
        To match the actual end of the string and not ignore an optional trailing newline, use \z.

        As soon as I noticed that /z and /Z are as different as a and A, I realized you were correct.

        Of course you are also correct about using  eq