Perl escalar de referência
Pergunta
Eu estou tentando fazer algumas escalar obra de referência.Aqui é uma versão simplificada do que eu estou tentando realizar.Atualmente, estou usando perl 5.10.1.
Notas:
*cor dinamicamente é obtido
*tentar obter um dizer 100, ou o valor vermelho
*Eu percebo isso, é muito mais fácil fazê-lo com um hash, mas como posso fazer isso com escalares?
$red = 100;
$blue = 150;
$green = 200;
$color = "red";
say ${$color};
Erro atual = ESCALAR ref enquanto "estrito refs"
Solução
O erro que você está recebendo é por causa do use strict
.Você precisa desligar strict refs
.
no strict 'refs';
say ${"$color"}; # "" are optional, I want to show it's about the string
Editar: Note que isto só funciona em global variáveis.Então, você precisa declará-los com our
ou use vars
em vez de my
.Isto está documentado no perlfaq7 e mostra por que não é uma boa idéia usar variáveis para o nome de outras variáveis.
É OK para desligar um strict
recurso em certos casos.Mas lembre-se que é uma boa prática para contê-lo dentro de um escopo muito limitado de modo a não afetar partes do seu programa que é melhor não ter esta desligado.
use strict;
use warnings;
use feature 'say';
our $red = 100;
our $blue = 150;
our $green = 200;
my $color = "red";
{
no strict 'refs'; # we need this to say the right color
say ${$color};
}
# more stuff here
Veja também:
Outras dicas
Usar um hash, que é o que eles são para:
my %color_value = (
red => 100,
blue => 150,
green => 200,
);
$color = "red";
say $color_value{$color};
Caso contrário, o erro foi reportado, porque você só se esqueceu de fazer no strict "refs";
.Mas, por favor, por favor não faça isso.
Além disso, para as respostas já dadas...
use strict;
use warnings;
use feature qw( say );
my $red = 100;
my $blue = 150;
my $green = 200;
my $color = \$red;
say ${$color};