Beefy Boxes and Bandwidth Generously Provided by pair Networks
We don't bite newbies here... much
 
PerlMonks  

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

by karlgoethebier (Abbot)
on Dec 01, 2012 at 19:57 UTC ( [id://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»

Replies are listed 'Best First'.
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
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1006632]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others taking refuge in the Monastery: (3)
As of 2024-04-25 18:48 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found