cal i calendar w jednym
Mon 01 June 2015 #technical #programming #perlOd 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 cal
a 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
.