Перл компиляции горе
У меня есть некоторые проблемы с компиляцией этого метода:
#changes the names of the associations for $agentConf
#where the key value pairs in %associationsToChangeDict are the old and new values respectively
sub UpdateConfObjectAssociations{
my($agentConf, %associationsToChangeDict) = @_;
foreach my $association ($agentConf->GetAssociations()) {
if ( grep {$_ eq $association->Name()} keys %associationsToChangeDict) {
my $newValue = %associationsToChangeDict{$association->Name()};
$association->Value($newValue);
}
}
}
Это сообщение об ошибке:
syntax error at D:\Install\AutoDeployScripts\scripts\Perl/.\AI\SiteMinderHelper
.pm line 75, near "%associationsToChangeDict{"
syntax error at D:\Install\AutoDeployScripts\scripts\Perl/.\AI\SiteMinderHelper
.pm line 79, near "}"
Кто-нибудь может увидеть, где проблема?
1 ответ
Да, вы можете получить фрагмент (то есть несколько значений) из хэша, например:
my @slice = @hash{ @select_keys };
И вы можете получить одно значение из хэша, например:
my $value = $hash{ $key };
Но вы не можете обратиться к хешу с начальным символом '%'. Это бессмысленно, если не считать Perl 6 (где сигилы не будут меняться в зависимости от числа).
Поскольку вам нужен один элемент из хэша, ваше назначение должно быть:
my $newValue = $associationsToChangeDict{ $association->Name() };
В Perl существует три контекста: void, scalar и list. Символ является скорее индикатором контекста, чем частью имени переменной. Мы видим пустой контекст, когда никто не ожидает результата от выражения. Этот контекст встречается только в sub
-s, когда программист просто хочет что-то сделать, и ему все равно, будет ли возвращено значение.
Это оставляет только скаляр и список, когда речь идет о переменных. Такая работа, как формы единственного и множественного числа в языке. Поскольку Ларри Уолл был под влиянием естественных языков при разработке Perl, эти параллели, ну, в общем, естественны. Но здесь нет "хэш-контекста". Конечно, чтобы немного усложнить ситуацию, что-то, оцениваемое как список при нахождении в скалярном контексте, также имеет контекстное значение, оно просто оценивает величину результирующего списка.
Вы вряд ли сделаете это (но это имеет значение):
my $count = @list[1..4];
Но вы могли бы сделать это:
my $count = ( grep { $_ % 2 == 0 } @list[ @subscripts ] );
Он будет выполнять всю оценку контекста списка внутри паренов, чтобы вычислить единственное значение общего количества элементов в списке. (Хотя grep
вероятно, достаточно умен, чтобы считать успехи, вместо того, чтобы формировать новый список, так как контекст распространяется в Perl.)