No estoy muy seguro de lo que quieres hacer, pero parece que es como un sistema de plantillas, o que quieres tener una serie de valores en ciertas variables.
Lo que sí está claro es que hay algunos errores en el código. Y el más grave es usar la forma @CMD[0]. El programa sí que te funciona, pero puede darte una sorpresa en algunas situaciones.
Verás, en Perl, los array tienen el sigilo '@' delante del nombre de la variable, que usamos en el momento de su declaración:
my @array;Pero a partir de ese momento, el sigilo que ponemos delante denota la pluralidad (o aridad) de los elementos que queremos almacenar/extraer de ese array.
Si vamos a almacenar un valor, uno solo, entonces tenemos que ponerlo un '$':
$array[1023] = "Vecino del quinto";
say $array[998];En cambio, si queremos acceder a varios elementos, el sigilo cambia a '@':
@array[23, 24, 100] = (12, "hola", sqrt 100);
@array[0 .. 19] = map { int 1 + rand 10 } 0 .. 19; # 20 números aleatorios entre 1 y 10, incluidos
print "@array[8,11]\n";Entonces, cuando en tu código pones @VARS[0], estás indicando a Perl que quieres recuperar "una lista de elementos desde VARS, compuesta de solo el elemento que está en la posición 0".
Esto, en principio, parece que no es importante, pero lo que estás haciendo es ejecutar esa sentencia en contexto de lista,
sobre lo que tienes en el lado izquierdo de la expresión. Y en Perl, hay funciones y métodos que funcionan de forma distinta si están en contexto escalar o en contexto de lista.
Dicho esto, he realizado algunos cambios en tu código, para que quede algo más sencillo.
Using perl Syntax Highlighting
my $USER = POSIX::cuserid();
my $FILE = $USER eq 'root' ? '/etc/rlsh_varlist.txt'
: "/home/$USER/rlsh_varlist.txt"
;
my $CMD = <STDIN>;
chomp $CMD;
my @CMD = split " ", $CMD;
if ($CMD[0] eq '#Export') {
open (VARLIST, ">>$FILE");
print VARLIST "$CMD[1] $CMD[2]\n";
close VARLIST;
}
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Using perl Syntax Highlighting
my $FILE = $USER eq "root" ? '/etc/rlsh_varlist.txt'
: "/home/$USER/rlsh_varlist.txt"
;
my %variables_hash;
open (my $READVARS, "<$FILE") or die "Variables not active\n";
while (my $row = <$READVARS>) {
chomp $row;
my @VARS = split " ", $row;
$variables_hash{ $VARS[0] } = $VARS[1];
}
close $READVARS;
# A partir de aquí ya tenemos el hash poblado de entradas
#
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Y ya puedes usar el hash, por ejemplo:
print $variables_hash{'mi_variable'}, "\n";P.D.: En Perl 6, las variables mantienen su sigilo a lo largo de todo el programa.