Beefy Boxes and Bandwidth Generously Provided by pair Networks
The stupid question is the question not asked
 
PerlMonks  

Re^5: (Mis)Understanding "works"

by tye (Sage)
on Feb 25, 2009 at 15:27 UTC ( [id://746292]=note: print w/replies, xml ) Need Help??


in reply to Re^4: (Mis)Understanding <c>grep...eq $_<c>
in thread (Mis)Understanding grep...eq $_

grep works just fine on arrays (and other lists). You live in a bizarre world if you interpret "grep works on arrays" to mean "grep is optimized to do something special if passed a single array similar to how foreach (in some versions of Perl) is optimized" (something that you can only detect by doing "weird" things). *shrug*

- tye        

Replies are listed 'Best First'.
Re^6: (Mis)Understanding "works"
by ikegami (Patriarch) on Feb 25, 2009 at 16:03 UTC
    He didn't say list including arrays. He said list and arrays. What's special about grepping an array? Does it remove elements from the array? If he had said yes, then my next question would have been to ask what grepping an array does and how to do it.

      Frankly, that is more bizarre. You jumped from "grep works on lists and arrays" to "grep works on lists in the normal way and does something completely different to arrays"?

      But if your worry was that someone rather magically thought that grep on an array removes things from the array, then why did you demonstrate a lack of optimization rather than demonstrating that grep doesn't modify the array?

      In any case, I don't think your point was well understood (which doesn't surprise me). I think you would have been more helpful had you responded differently to the slightly redundant but not incorrect inclusion of "and arrays" which likely shows a leak of or bow to the common false dichotomy between "list" and "array" in Perl. Rather than elevate this false dichotomy to the point of "works on arrays" means "does something /different/ with arrays", you should have just noted that "grep works on lists. an array can be used as a list". That is, push back against the false dichotomy.

      grep works on lists. So, of course, it also works on arrays (which are a type of list).

      Bizarre consequences of optimizations of foreach seem particularly unenlightening to, more distracting from that point.

      - tye        

      Update:posted this my mistake at wrong reply level. I am agreeing with Tye and showing an example of how to use grep on "arrays".

      I don't know exactly what is meant by "array" in a Perl context. There are lists and lists of lists of lists(LoL) and of course lists of lists of lists(LoLoL), Lists of Hashes (LoH), etc. grep works great on all these things! If you mean that a LoL is an "array" then here is one example of how to use grep on something like that:

      #!/usr/bin/perl -w use strict; #remove "rows" that don't have a value greater than 75 my $value =75; my $rLoL = [ [78,43,87], [64,73,72], [99], [65,67,71] ]; @$rLoL = grep { (grep {$_ > $value}@$_)>=1}@$rLoL; foreach my $ref (@$rLoL) { print "@$ref\n"; } #prints #78 43 87 #99 #the inside grep above is used in a scalar context. #It basically says "do we want to keep this list or not?" #outside grep passes list ref to output based upon that #true/false decision. #grep{} works with anything that can be reduced to a #yes/no question #@LoH = grep{keys (%_) > 2}@LoH #removes hashes from List of Hashes that have fewer #than 3 keys.
        Grep can be used in very complex ways. I'm posting yet another example of how to use grep{} on complex structures. A grep within a grep is just fine as above post shows, but it is also possible to use map{} within a grep.

        Basically when you are thinking about filtering something out, think about grep. Map{} is used to change or transform something and often folks get these ideas confused. Also many folks think that Perl grep is like Unix grep with regex'es. Perl grep is WAY more powerful! The code below operates on a list of matrices and deletes those which have fewer than some minimum number of total elements.

        #!/usr/bin/perl -w use strict; use Data::Dumper; my $min_elements = 11; my $rLoLoL =[ [ [78,43,87], [64,73,72], [99], [65,67,71] ], [ [1,2,3], [4,5], [6,7],[8, 9, 10, 11] ], ]; @$rLoLoL = grep { (my @elements = map{@$_}@$_)>= $min_elements }@$rLoLoL; #some explanation ...most folks posting in this thread have #thousands of posts and are experienced..but perhaps this will #help others...although most folks don't go down this deep #into the thread... #the @$rLoLoL gets the list of references to matrices, the #list of lists of lists (LoLoL). # in: ...map{@$_}@$_), this last @$_ gets List of List's # the map{} takes each one of these and "flattens the matrix # out", what goes into @elements is like (78,43,87,64,73,72,99,65,67,7 +1). # print Dumper ($rLoLoL); #the first "matrix" with 10 total elements has been removed... __END__ Prints: $VAR1 = [ [ [ 1, 2, 3 ], [ 4, 5 ], [ 6, 7 ], [ 8, 9, 10, 11 ] ] ];

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others goofing around in the Monastery: (3)
As of 2024-03-29 05:05 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found