perl away
(Da, stiu ca n-am mai scris de mult, sorry).
Uite problema pe care am avut-o azi: sa se ia un script existent care sterge dintr-un maildir mailurile mai vechi decat o data specificata in linia de comanda si sa se ajusteze sa ia si parametru de tip "X days ago".
Sounds pretty easy. And it is. Da' mi s-a facut mila cand am vazut ca scriptul (perl) se uita intr-un maildir cu sute de mii de fisiere si itereaza peste `ls -g -G -U --time +%Y%M%d`, asa ca m-am induplecat si l-am rescris (zic eu) mai elegant.
In primul rand mi-am zis ca e pacat sa faci mega-liste cu ls si ca poti gasi ceva metoda decenta de a face asta direct din perl. Cu ce traversezi frumos structuri de fisiere? Cu File::Find, of course! E in core? Este de la 5.0, nu e nevoie de instalare. Un super feature al lui File::Find e ca exista un programel care se cheama find2perl care accepta (aproape orice fel de) argumente pentru GNU find si returneaza un program perl care face aceeasi chestie cu File::Find (ocazie cu care mi-am adus aminte ca in Higher Order Perl era un capitol foarte dragut cu ce poti face cu stilul asta de callbacks, ar trebui sa-l recitesc). Bonus points ca am descoperit ca stat() face cache la filehandle in _ ca sa poti face repede mai multe teste succesive pe acelasi fisier. Useful trick.
Boon, acum aproape ca avem un script decent, ramane sa-i fac si partea de UI, anume stabilita semnificatia argumentelor. Mi-am adus aminte ca Damien Conway avea niste sfaturi utile in Perl Best Practices, asa ca am recitit capitolul cu pricina (bine ca port dupa mine exemplare electronice pirat ale cartilor din biblioteca), ocazie cu care am adaugat si Getopt::Long in lista de dependinte (don't worry, tot core module). Am adaugat ici-colo niste defaults si niste mesaje, si iaca scriptuletul. Nu e cine stie ce, dar mi-a dezmortit putin mintea (sunt gripat zilele astea) si, sper eu, va fi mai usor de citit/debugat de catre urmasi. Maine fac si niste teste de performanta, sunt curios cum se comporta fata de versiunea dinainte.
PS: Am cautat cateva minute si n-am gasit niste template-uri decente de usage(), help() si eventual POD pt. subrutine. "Decent" inseamna "nu trebuie musai sa fie CPAN-friendly, dar cat sa arate ok la un --help sau perldoc". Please share.