in reply to Re: Until there's nothing but spaces?
in thread Until there's nothing but spaces?

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

Replies are listed 'Best First'.
Re:x2 Until there's nothing but spaces?
by grinder (Bishop) on Oct 01, 2001 at 17:16 UTC

    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