Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

Hi there Monks!
I am trying to get every past 3 months from the current month, running out of ideas and stuck here:
#!/usr/bin/perl use strict; use warnings; my ($second, $minute, $hour, $dayOfMonth, $month, $yearOffset, $dayOfW +eek, $dayOfYear, $daylightSavings) = localtime(); my $month_number = $month + 1; my %months_name = ( 1 => 'January', 2 => 'February', 3 => 'March', 4 => 'April', 5 => 'May', 6 => 'June', 7 => 'July', 8 => 'August', 9 => 'September', 10 => 'October', 11 => 'November', 12 => 'December', ); print "Current month is: $months_name{$month_number}\n"; my @months = qw(January February March April May June July August Sept +ember October November December); my @three_months = splice @months, -12, $month_number; print "\n @three_months\n";

Might be a better way of doing this, "splice" will remove the 3 month from the array and I would have to add it back for the next month. Then when is January I have to get the last two month from the start of the array to get "November - December - January".
Can't think!
Thanks for any good idea or help!

Replies are listed 'Best First'.
Re: Print every past three months from current month
by wazat (Monk) on Apr 01, 2014 at 03:23 UTC

    Why not take a slice instead of using splice.

    my @a = qw( a b c d e f g ); sub f { my $i = shift; print join(',', @a[$i-2, $i-1, $i]), "\n"; } f(0); f(1); f(2); f(6);

    outputs

    f,g,a g,a,b a,b,c e,f,g
      Hi, think if it was months, the count has to go backwards, and I can't get it to do it:
      my @months = qw( January February March April May June July October No +vember December ); # passing 4 for April, I should get "February March April", instead I +get: "March April May". f(4); sub f { my $i = shift; print join(',', @months[$i-2, $i-1, $i]), "\n"; }

      Thanks!

        Remember that perl array indices start at zero. April would have index 3, not 4. Also you are missing August and September.

        my @months = qw( January February March April May June July August Sep +tember October November December ); f(3); # Apr f(0); # Jan f(11); # Dec sub f { my $i = shift; print join(',', @months[$i-2, $i-1, $i]), "\n"; }

        Output

        February,March,April November,December,January October,November,December
        c:\@Work\Perl\monks>perl -wMstrict -le "my %months_name = qw( 1 January 2 February 3 March 4 April 5 May 6 June 7 July 8 August 9 September 10 October 11 November 12 December ); ;; my @months = map $months_name{$_}, sort { $a <=> $b } keys %months_na +me; ;; for my $n (1 .. 12) { my @prev_3 = map $n-1+$_, -3 .. -1; @prev_3 = @months[ @prev_3 ]; print qq{(@prev_3) before $months_name{$n} (month $n)}; } " (October November December) before January (month 1) (November December January) before February (month 2) (December January February) before March (month 3) (January February March) before April (month 4) (February March April) before May (month 5) (March April May) before June (month 6) (April May June) before July (month 7) (May June July) before August (month 8) (June July August) before September (month 9) (July August September) before October (month 10) (August September October) before November (month 11) (September October November) before December (month 12)
Re: Print every past three months from current month
by tangent (Parson) on Apr 01, 2014 at 02:52 UTC
    This might help:
    my @three_months; for (1..3) { $month_number--; $month_number ||= 12; unshift(@three_months,$month_number); }