Pregunta

Estoy intentando hacer un trabajo de referencia escalar.Aquí hay una versión simplificada de lo que estoy tratando de lograr.Actualmente estoy usando Perl 5.10.1.

Notas:

*el color se obtiene dinámicamente

*tratando de obtener digamos 100, o el valor rojo

*Me doy cuenta de que esto es mucho más fácil de hacer con un hash, pero ¿cómo puedo hacerlo con escalares?

$red = 100;
$blue = 150;
$green = 200;

$color = "red";

say ${$color};

Error actual = referencia ESCALAR mientras "referencias estrictas"

¿Fue útil?

Solución

El error que estás recibiendo se debe a use strict.Necesitas apagar strict refs.

no strict 'refs';
say ${"$color"}; # "" are optional, I want to show it's about the string

Editar: Tenga en cuenta que esto sólo funciona en global variables.Entonces necesitas declararlos con our o use vars en lugar de my.Esto está documentado en perlfaq7 y muestra por qué no es una buena idea utilizar variables para nombrar otras variables.


Está bien apagar un strict característica en ciertos casos.Pero recuerde que es una buena práctica contenerlo dentro de un alcance muy limitado para que no afecte partes de su programa que es mejor no tener esto desactivado.

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

Ver también:

Otros consejos

Usa un hash, eso es para:

my %color_value = (
    red => 100,
    blue => 150,
    green => 200,
);

$color = "red";

say $color_value{$color};

De lo contrario, se informó su error porque simplemente se olvidó de hacerlo no strict "refs"; .Pero por favor, por favor, por favor No hagas eso .

Además de las respuestas ya dadas ...

use strict;
use warnings;
use feature qw( say );

my $red = 100;
my $blue = 150;
my $green = 200;

my $color = \$red;

say ${$color};

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top