Perl Brasil

Pesquisar

Documentação

Artigos

Planeta

Eventos

Comunidade

r3 - 06 Aug 2006 - JoenioCosta

Como expandir variáveis dentro de uma string

Problema

Você tem uma string contendo nomes de variáveis que não foram expandidas:

$text = 'foo é $foo e bar é $bar';

...e gostaria de substituir as variáveis por seus valores em tempo de execução.

Solução

Coloque as variáveis dentro de um hash e use a expressão regular para substitui-las por seu valor:

  %var = (
   foo  => 23,
   bar  => 19,
  );
  $text =~ s/\$(\w+)/$var{$1}/g;

Discussão

Você poderia usar uma substituição com duplo-eval ("eeg"):

  $text =~ s/(\$\w+)/$1/eeg;

O primeiro /e transforma $1 em $foo, e o segundo recupera seu valor.

No entanto, se o nome da variável não existir, isso poderá causar um erro de execução. Para evitar isso, você poderia colocar a expressão regular dentro de um eval:

    eval { $text =~ s/(\$\w+)/$1/eeg };
    die if $@;

Ainda assim, a string poderia acessar qualquer variável dentro do módulo, o que pode não ser desejável.

Nesse caso, a melhor solução é utilizar um hash para armazenar as variáveis que poderão ser acessadas a partir da string:

  %var = (
   foo  => 23,
   bar  => 19,
  );
  $text =~ s/\$(\w+)/$var{$1}/g;

Comentários