0

我在编译这个方法时遇到了一些麻烦:

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

谁能看出问题出在哪里?

4

1 回答 1

7

是的,您可以像这样从哈希中获取切片(即多个值):

my @slice = @hash{ @select_keys };

您可以像这样从哈希中获取单个值:

my $value = $hash{ $key };

但是你不能用'%' sigil 开头的散列。缺少 Perl 6 是没有意义的(其中印记不会根据数字而改变)。

因为你想从哈希中取出一个项目,你的分配应该是:

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

Perl 中有 3 个上下文,voidscalarlist。sigil 更像是上下文的指示符,而不是变量名的一部分。当没有人期望从表达式返回结果时,我们会看到一个无效的上下文。此上下文仅出现在sub-s 中,当程序员只想完成某事而不关心是否返回值时。

在谈论变量时,只剩下标量列表。这些工作就像语言中的单数和复数形式。由于 Larry Wall 在设计 Perl 时受到自然语言的影响,因此这些相似之处是很自然的。但是没有“哈希上下文”。当然,稍微复杂一点,当包装在标量上下文中时评估为列表的东西也具有上下文含义,它只是评估结果列表的大小。

您不太可能这样做(但它有一个含义):

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

但你可以这样做:

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

它将在括号内执行所有列表上下文评估,以评估列表中项目总数的单个值。(虽然grep可能足够聪明,可以计算成功,而不是形成一个新列表,因为上下文在 Perl 中传播的。)

于 2010-11-03T02:46:26.070 回答