http://www.perlmonks.org?node_id=1150991


in reply to Need help understanding code snippet with "grep -f"

The -f is a file operator that returns true if the file (by default given in $_) exists so the grep is testing to see if named files exist and dropping any that don't exist out of the list.

grep can use either grep {...} @list or grep ..., @list syntax. You are using the second variant.

grep {-f} map {...} @list;

might be clearer.

Update: Oh, and to "find all the files" you need something like glob:

my @files = grep {-f} map {glob "$_/*vp.o$id"} qw/ archiv/;

Although if you are using glob the grep is probably redundant.

Premature optimization is the root of all job security

Replies are listed 'Best First'.
Re^2: Need help understanding code snippet with "grep -f"
by Marshall (Canon) on Dec 23, 2015 at 07:48 UTC
    my @files = grep {-f} map {glob "$_/*vp.o$id"} qw/ archiv/;
    I figure the grep -f and the map are both not necessary.
    Shouldn't this work also?
    my @files = glob {"archiv/*vp.o$id"};
      I figure the grep -f and the map are both not necessary. Shouldn't this work also?
      my @files = glob {"archiv/*vp.o$id"};

      No. glob does not check the type of the file. -f does:

      /tmp>touch foo.txt /tmp>mkdir bar.txt /tmp>ls -lF [...] drwxr-xr-x 2 alex users 40 Dec 23 10:16 bar.txt/ -rw-r--r-- 1 alex users 0 Dec 23 10:16 foo.txt [...] /tmp>perl -E 'say for glob "*.txt"' bar.txt foo.txt /tmp>perl -E 'say for grep -f,glob "*.txt"' foo.txt /tmp>

      Alexander

      --
      Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so". ;-)
        Yes, this is quite correct!

        We are getting far from the original point.

        I think that instead of creating a bunch of sub-directories, a simple DB file would be just fine. An EXCEL .csv file would be fine.

      The map is useful if you have a list containing more than one item. As I said in my OP the grep is redundant if you are using glob.

      Premature optimization is the root of all job security
        I think the OP has working code and all is fine.

        I don't see any reason at all to quibble. The Perl map{} especially in conjunction with Perl grep{} in the comma format can be hard to understand.

Re^2: Need help understanding code snippet with "grep -f"
by fifaltra (Acolyte) on Dec 23, 2015 at 04:16 UTC
    Thanks a lot for the explanation. I changed it to just glob now. Works perfectly and I learned something new today! Yay!