martedì 3 gennaio 2017

Un brutto ma veloce meccanismo di interpolazione di stringhe in Perl

Ecco un meccanismo semplice e veloce, quanto brutto, per fare una interpolazione di stringa in Perl via nome dei parametri invece che posizione. L'idea è quella di associare i parametri in un hash con le chiavi relative, e poi effettuare una sostituzione tramite regexp sulla stringa per sostituire i parametri ovunque appaiano.
La stringa di inizio/fine interpolazione può essere ovviamente qualunque sequenza sensata, nell'esempio che segue ho usato quella dell'interpolazione Ruby.


#!/usr/bin/env perl

use v5.10;

my $params = {
   foo => "this is foo"
       , bar => 'this is bar'
       , baz => 'this is baz'
};


my $string = "Here is a string that needs to substitute variables #{foo} and #{bar} and last #{b
az}!";

( my $result = $string ) =~ s/\#{(\w+)}/$params->{$1}/ge;

say $result;


Come si può notare ogni parametro da interpolare è racchiuso fra la stringa #{ e ], con il nome relativo al parametro. Quindi #{foo} viene poi sostuito con il valore di $params->{foo}. Per fare questo si utilizza un backreference nella cattura della parola \w+ racchiusa come primo parametro $1 nell'espressione regolare.

Ecco un esempio piu' utile di questa interpolazione:


my $params = {  
   username => 'luca'
       , server => 'remote.node.com'
       , port => 22
       , protocol => 'ssh'
};


my $connection_string = "#{protocol}://#{username}@#{server}:#{port}";

( my $url = $connection_string ) =~ s/\#{(\w+)}/$params->{$1}/ge;

che produce come risultato finale ssh://luca@remote.node.com:22

java: No such file or directory (!)

Ci sono applicazioni che richiedono un JDK per eseguire correttamente, così l'unica cosa che si può fare è quella di scaricare dal sito Oracle una qualche versione, installarla, configurare JAVA_HOME o qualcosa di simile (a seconda dell'applicazione) e lanciare il programma desiderato.
Abbastanza semplice, no?
Eppure oggi ho dovuto combattere con una installazione della JDK 1.8 (111) e un errore abbastanza subdolo riportato dalla shell:

/opt/jdk1.8.0_111/bin/java: No such file or directory

quando ovviamente il file era al suo posto, eseguibile e pronto a servire il sistema.
Inizialmente ero protato a pensare ad un classico problema di permessi, ma come ho già scritto il file era correttamente eseguibile. Forse un problema di exec sul filesystem? No, nemmeno questo.
Dopo un po' di ricerca ho scoperto che il mio pc mancava di una libreria, e quindi ben presto si è fatto un passo avanti:

sudo apt-get install libc6-i386

ma questo ancora non era sufficiente a far funzionare tutto l'ambiente, specialmente quello grafico, e così ho dovuto installare anche

sudo apt-get install libxrender1:i386 libxtst6:i386 libxi6:i386

e finalmente ho un jdk funzionante perfettamente.
Certo che il primo errore, quello riportato dalla shell, è piuttosto fuorviante!