Beefy Boxes and Bandwidth Generously Provided by pair Networks
Welcome to the Monastery
 
PerlMonks  

Re^2: How can i debug compound map/grep statements just using print?

by karlgoethebier (Vicar)
on Dec 01, 2012 at 19:57 UTC ( #1006632=note: print w/ replies, xml ) Need Help??


in reply to Re: How can i debug compound map/grep statements just using print?
in thread How can i debug compound map/grep statements just using print?

No.

Karls-Mac-mini:~ karl $ perl -e 'print 2*60*60;' 7200
perl -e 'print scalar( grep { $_ == 1 } (0,0,0) );' # nothing found 0
perl -e 'print scalar( grep { $_ == 1 } (1,0,0) );' # one found 1

«The Crux of the Biscuit is the Apostrophe»


Comment on Re^2: How can i debug compound map/grep statements just using print?
Select or Download Code
Re^3: How can i debug compound map/grep statements just using print?
by Kenosis (Priest) on Dec 01, 2012 at 21:39 UTC

    You have the following:

    =item B<-a, --amount> Search for files older than <amount> days, mandatory.

    In two days, there are 2 * 24 * 60 * 60 or 172800 seconds, thus it seemed that the following was needed:

    $amount = $amount * 24 * 60 * 60;

    since one day equals 24 * 60 * 60 or 86400 seconds. Additionally, the following worked when I ran it using the above formula for $amount:

    $result = grep { /.+\.$suffix$/ and $time - ( $_->stat )[9] >= $amount } io($dir)->all;

    An equivalent search can be done using File::Find::Rule:

    $result = File::Find::Rule->file() ->maxdepth(1) ->name(qr/.+\.$suffix$/i) ->mtime(">= $amount") ->in($dir);

    And the following, too, but grepping on days old instead of using mtime:

    $result = grep { -M >= $amount / 86400 } # Convert back to days File::Find::Rule->file() ->maxdepth(1) ->name(qr/.+\.$suffix$/i) ->in($dir);

    All three methods produced the same result, even when an equivalent constant was used for the days in the last grep.

    After adjusting the $amount formula, your original code produced the same result, too:

    $result = grep { $_ == 1 } map { $time - $_ >= $amount } map { ( $_->stat )[9] } # e.g i'm interested in this... grep { $_->name =~ /.+\.$suffix$/ } # ...and this io($dir)->all;

    Thus, all four code snippets produced identical results.

      Sorry about that awkward typo: should have been hours...

      «The Crux of the Biscuit is the Apostrophe»

        Ah, yes--that makes sense! Used the hours calculation for all four snippets:

        $amount = $amount * 60 * 60;

        and got identical results, until 79 hours was used (a result difference of 2), but I suspect the division in the grep { -M >= $amount / 86400 } yields a different precision.

        Interestingly, IO::All didn't see the file "song自然之歌," but File::Find::Rule did (and should have).

      "An equivalent search can be done using File::Find::Rule"

      This is simply true, but what i wanted to do was this:

      • Not using File::Find
      • Not using File::Find::Rule"
      • Not using qx(find...[options])
      • Bothering myself with map/grep

      Thank you very much for your advice and the insights you gave to me. Regards, Karl

      «The Crux of the Biscuit is the Apostrophe»

        I really should have said that I wasn't suggesting a different or better way by using File::Find::Rule. Only used it to verify your results (like inter-rater reliability). Yours was a good map/grep piece.

        Nice update, by the way...

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others perusing the Monastery: (6)
As of 2015-07-07 04:19 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (87 votes), past polls