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


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

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.

Replies are listed 'Best First'.
Re^4: How can i debug compound map/grep statements just using print?
by karlgoethebier (Abbot) on Dec 02, 2012 at 00:03 UTC

    "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...

Re^4: How can i debug compound map/grep statements just using print?
by karlgoethebier (Abbot) on Dec 01, 2012 at 23:22 UTC

    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).

        I'm lucky not having a file named இளவரசன்.mp3 ;-)

        «The Crux of the Biscuit is the Apostrophe»