Перл компиляции горе - PullRequest
0 голосов
/ 03 ноября 2010

У меня какая-то проблема с компиляцией этого метода:

#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 Ответ

7 голосов
/ 03 ноября 2010

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

my @slice = @hash{ @select_keys };

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

my $value = $hash{ $key };

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

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

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

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

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

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

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

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

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

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

...