When you open a directory and read it, you get all the files in it. As you see "." and ".." are files in every directory. A directory is a file, so it could be that there are other sub-directories in your test directory.

opendir(DIRHANDLE, $testdir) or die "couldn't open directory: $testdir +"; @filenames = grep {-f "$testdir/$_"} readdir(DIRHANDLE); closedir(DIRHANDLE);
What the grep addition does is filter the ouput of readdir so that @filenames only winds up with filenames that are "normal files", ie, not directories. Meaning that "." and ".." and any other sub-dirs are excluded from the list! ergo, no need for the logic test on ne "." and ".."! Of course you already see that the filenames are just the raw names and the dir path needs to be prepended when you use those names, even in this grep.

Perl grep is way cool and is often used to filter lists. If the last statement in the grep evaluates to "true" the input on right is passed to output on left.

another point: no need to use . concatenation op in many string cases. Perl will interpolate a $var inside of double quotes (like die statement above) and -f "$testdir/$_", the quotes are needed otherwise Perl would think that this is a division.


In reply to Re: This is why Perl is so frustrating by Marshall
in thread This is why Perl is so frustrating by eggmatters

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.