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

Nessun commento: