2010-01-25 10 views
5

Necesito devolver un valor enum en perl, ¿cómo puedo hacer esto? debe Does Perl have an enumeration type?¿Cómo puedo crear un tipo de enumeración en Perl?

use strict; 

use constant { 
    HOME => 'home', 
    WORK => 'work', 
    MOBILE => 'mobile', 
}; 

my $phone_number->{type} = HOME; 
print "Enum: ".$phone_number->{type}."\n"; 

pero no este índice de retorno 0:

tirando de este hilo? o estoy entendiendo esto mal?

EDIT:

Así que sería algo como esto ser más esperable para un tipo de enumeración?

use strict; 

use constant { 
    HOME => 0, 
    WORK => 1, 
    MOBILE => 2, 
}; 

my $phone_number->{type} = HOME; 
print "Enum: ".$phone_number->{type}."\n"; 

editar # 2

También me gustaría para validar la opción seleccionada, pero pasar de nuevo a la Palabra en lugar de Valor. ¿Cómo puedo tener lo mejor de ambos ejemplos?

@VALUES = (undef, "home", "work", "mobile"); 

sub setValue { 

if (@_ == 1) { 
    # we're being set 
    my $var = shift; 
    # validate the argument 
    my $success = _validate_constant($var, \@VALUES); 

    if ($success == 1) { 
     print "Yeah\n"; 
    } else { 
     die "You must set a value to one of the following: " . join(", ", @VALUES) . "\n"; 
    } 
} 
} 

sub _validate_constant { 
# first argument is constant 
my $var = shift(); 
# second argument is reference to array 
my @opts = @{ shift() }; 

my $success = 0; 
foreach my $opt (@opts) { 
    # return true 
    return 1 if (defined($var) && defined($opt) && $var eq $opt); 
} 

# return false 
return 0; 
} 
+0

¿Qué quiere decir con * índice 0 *? –

+3

¿Has leído la respuesta aceptada a la pregunta que vinculó? Especialmente la parte que dice que Perl * no * tiene un tipo de enumeración? Si es así, ¿de dónde esperas que aparezca el "índice 0"? – friedo

+0

@friedo Estoy de acuerdo contigo, solo quiero asegurarme de entender esto bien. Necesito tener la opción de establecer HOME pero devolver 0. ¿Cambiaría simplemente el valor a 0? Ver Editar –

Respuesta

2

Una constante no es una enumeración (en Perl, o en cualquier idioma que conozco)

No, porque aquí lo que está haciendo está insertando en la tabla símbolo un vínculo entre la clave HOME y el literal Home, esto también se llama bareword en lenguaje perl. La tabla de símbolos se implementa con un hash, y no hay un número equivalente de sus claves y el orden en que se agregaron.

En su ejemplo, lo que hace es establecer $perl_number->{type} = 'Home', y luego imprimir $phone_number->{type}.

+0

Invocar la tabla de símbolos realmente no importa. Es mucho menos confuso para las personas decir que se crea una subrutina que no toma argumentos y devuelve un valor constante. Deja las tripas fuera de ella. –

+0

@brian Esta es mi respuesta, puede dejar la suya con la opción "Agregar otra respuesta" en la parte inferior de la pantalla. –

+1

Por supuesto, sí agregué mi respuesta. Sin embargo, también ayudo a las personas a refinar y corregir sus propias respuestas. Las tablas de símbolos son una confusión innecesaria aquí, y parece un poco confundido acerca de lo que realmente está sucediendo. Puede proporcionar mejores respuestas si les brinda más atención al omitir detalles innecesarios. –

2

Si desea enumeraciones, utilice el módulo enum.

+0

Lea el hilo al que hace referencia, según la pregunta. –

+1

Sí, ya lo leí. No cambia mi respuesta. –

Cuestiones relacionadas