Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation
 
PerlMonks  

Re:Need help understanding code snippet with "grep -f"

by GrandFather (Saint)
on Dec 23, 2015 at 03:01 UTC ( #1150991=note: print w/replies, xml ) Need Help??


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!

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1150991]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others exploiting the Monastery: (5)
As of 2021-04-13 13:06 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found

    Notices?