2010-11-03 5 views
0

У меня возникли некоторые troble компиляцией этот метод:Perl компиляции Беды

#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 "}" 

Может кто-нибудь увидеть, где проблема?

ответ

7

Да, вы можете получить срез (т.е. несколько значений) из хэша вроде этого:

my @slice = @hash{ @select_keys }; 

И вы можете получить одно значение из хэша, как это:

my $value = $hash{ $key }; 

Но вы не можете адресовать хеш с началом '%' sigil. Это бессмысленно меньше Perl 6 (где сигилы не будут меняться в зависимости от числа).

Потому что вы хотите один элемент из хэша, ваше задание должно быть:

my $newValue = $associationsToChangeDict{ $association->Name() }; 

Есть три контекстов в Perl, аннулируются, скалярная и список. Сигила является скорее индикатором контекста, чем части имени переменной. Мы видим контекст void, когда никто не ожидает результата от выражения. Этот контекст возникает только в sub-с, когда программист просто хочет что-то сделать, и не волнует, возвращается ли значение.

То, что оставляет только скаляр и , говоря о переменных. Такая работа, как единичные и множественные формы на языке. Поскольку Ларри Уолл находился под влиянием естественных языков при проектировании Perl, эти параллели, естественно, естественны. Но нет «хэш-контекста». Разумеется, чтобы немного усложнить ситуацию, что-то оцениваемое как список, когда оно завернуто в скалярный контекст, также имеет контекстуальный смысл, оно просто оценивает величину полученного списка.

Вы не вероятно это сделать (но это имеет смысл):

my $count = @list[1..4]; 

Но вы могли бы сделать это:

my $count = (grep { $_ % 2 == 0 } @list[ @subscripts ]); 

Он будет делать все, что оценка контекста список внутри скобок, для оценки единственного значения общего количества элементов в списке. (Хотя grep, вероятно, достаточно умен, чтобы считать успехи, вместо того, чтобы формировать новый список, поскольку контекст -, распространенный в Perl.)

+0

Спасибо Axeman - отличная работа! –