Ten artykuł został napisany bardzo dawno temu. Istnieje duże prawdopodobieństwo, że od tego czasu autor zmienił swoje poglądy!

cal i calendar w jednym

Od jakiegoś czasu chciałem sobie jakoś sprytnie połączyć w jedno dostępne w większości dystrybucji GNU/Linuxa programy cal oraz calendar, które w mojej ocenie są niesamowicie dobrymi rozwiązaniami terminarzowymi, z których można korzystać w terminalu, szczególnie, gdy dorzuci się je do swojego .bashrc tak, żeby przy każdym włączeniu terminala pełniły rolę przypominajki o ważnych terminach.

Dla mnie jednak jest w tym mały problem, a mianowicie output z takich poleceń jest dość pokaźny. Wolałbym to mieć w bardziej skondensowanej formie, szczególnie, że obecnie częściej mamy do czynienia z ekranami o większej szerokości niż wysokości. Dla przykładu output takiego polecenia:

    $ cal; calendar
       Czerwiec 2015      
    ni po wt śr cz pi so  
        1  2  3  4  5  6  
     7  8  9 10 11 12 13  
    14 15 16 17 18 19 20  
    21 22 23 24 25 26 27  
    28 29 30

    Jun 02  Non-Profit status of SPI approved, 1999
    Jun 02  First issue of Computerworld, 1967
    Jun 03  Debian's Diversity Statement ratified, 2012
    Jun 05  Debian GNU/Linux 1.3 alias ``bo'' released, 1997
    Jun 06  Debian GNU/Linux 3.1 alias ``sarge'' released, 2005
    Jun 06  Incorporation of Software in the Public Interest completed, 1997

Jak widać jest to dość długie, a po prawej stronie outputu z cala jest całkiem sporo miejsca. Jak więc połączyć wyniki obu programów w jakiś miły sposób? Podejść może być wiele, dla mnie wygodnie było sklepać w tym wypadku prosty skrypt w Perlu (dodatkowo ciekawostka, ale jest to język skrojony na potrzeby przetwarzania tekstu).

Moje rozwiązanie tego problemu pewnie bardzo odkrywcze nie jest. Pewnie można by też napisać to krócej. Jeszcze sobie nad tym pomedytuje, ale tak wygląda moje rozwiązanie sklepane na kolanie w Perlu.

EDIT 2015-06-04

Zgodnie z komentarzem od Brainfuck usunąłem funkcję split z kodu w miejscach, gdzie przypisujemy wyjście z zewnętrznych programów. Kontekst listowy w tym wypadku załatwia nam sprawę i wrzuca każdą linię osobno w tablicę. Konteksty to zdecydowanie piękna rzecz w Perlu.

    #!/usr/bin/perl
    # author : Jakub Olczyk <jakub.olczyk@openmailbox.org>
    # date   : 2015-06-01
    # license: GPLv3+
    use strict;
    use feature 'say';

    my @cal_output =  `cal`;
    my @calendar_output =  `calendar`;
    my @output;

    while(my ($i, $line) = each @cal_output){
        chomp $line;
        $output[$i] = $line."\t".($calendar_output[$i] // "");
    }

    local $" = "\n";
    say "@output";

Jak na razie wydaje mi się, że taki skrypcik skutecznie będzie spełniał swoje zadanie.

Przykładowy output:

       Czerwiec 2015        Jun 02  Non-Profit status of SPI approved, 1999
    ni po wt śr cz pi so    Jun 02  First issue of Computerworld, 1967
        1  2  3  4  5  6  
     7  8  9 10 11 12 13  
    14 15 16 17 18 19 20  
    21 22 23 24 25 26 27  
    28 29 30

Oczywiście, w tym skrypcie przyjmuję założenie, że nie chcemy mieć więcej informacji z calendar niż ilość linii, które wypluwa cal.