Использование shift
в пределах eval
строки, которая находится внутри sub
не работает: сдвиг не работает в пределах Eval строки
Пример 1 (с использованием eval
):
grab_variable($variable1,$variable2,$variable3);
print $variable1.$variable2.$variable3; #should print: 123
sub grab_variable {
my $number_of_parameters = @_;
my $command1;
my $command2;
for (my $i = 1; $i <= $number_of_parameters; $i++) {
$command1.= "\$RefVariable".$i." = \\shift;\n";
#Generates string like:
#$RefVariable1 = \shift;
#$RefVariable2 = \shift;
#...
}
eval $command1;
for (my $i = 1; $i <= $number_of_parameters; $i++) {
$command2.= "\$\{\$RefVariable".$i."\} = ".$i.";\n";
#Generates string like:
#${$RefVariable1} = 1;
#${$RefVariable2} = 2;
#...
}
eval $command2;
}
Пример 2 (прямой код) :
grab_variable($variable1,$variable2,$variable3);
print $variable1.$variable2.$variable3; #Prints: 123
sub grab_variable {
$RefVariable1 = \shift;
$RefVariable2 = \shift;
$RefVariable3 = \shift;
${$RefVariable1} = 1;
${$RefVariable2} = 2;
${$RefVariable3} = 3;
}
Пример 1 является динамическим и достигает решения моей реальной (не упрощенной) проблемы. Как я могу сделать \shift
работу внутри строки кода eval
?
В частности, я пытаюсь сделать функцию (подпрограмму), который принимает любое количество переменных (в качестве аргументов) и передавался в качестве ссылок (не значений), потому что она должна изменить их.
'$ grab_variable ($ Var)' является недействительным синтаксис. – simbabque
'' \ $ RefVariable ". $ i' является [запахом кода] (http://stackoverflow.com/questions/1549685/how-can-i-use-a-variable-as-a-variable-name-in-perl). Разве нет способа сделать это с помощью массивов? – mob
Кроме того, если вы просто пытаетесь выполнить передачу по ссылке, содержимое '@ _' уже является псевдонимом аргументов, переданных подпрограмме. '$ Исх = \ сдвиг; $$ ref = "foo"; 'равнозначно' $ _ [0] = "foo" ' – mob