我正在编译这种方法:
#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 "}"
任何人都可以看到问题所在吗?
答案 0 :(得分:7)
是的,您可以从这样的哈希中获取切片(即多个值):
my @slice = @hash{ @select_keys };
你可以从这样的哈希中获得一个值:
my $value = $hash{ $key };
但是你不能用起始'%'sigil来处理哈希。它与Perl 6毫无意义(其中sigils不会根据数字而改变)。
因为您希望哈希中有一个项目,所以您的分配应该是:
my $newValue = $associationsToChangeDict{ $association->Name() };
Perl中有三种上下文, void ,标量和列表。 sigil更多是 context 的指示符,而不是变量名称的一部分。当没有人期望从表达式返回结果时,我们会看到 void 上下文。这个上下文只发生在sub
- s中,当程序员只是想要完成某些事情时,并不关心是否返回了一个值。
在谈论变量时只留下标量和列表。这种工作就像一种语言中的单数和复数形式。由于Larry Wall在设计Perl时受到自然语言的影响,因此这些相似之处很自然。但是没有“哈希上下文”。当然,为了使问题稍微复杂化,在标量上下文中包含时被评估为列表的内容也具有上下文含义,它只是评估结果列表的大小。
你不太可能这样做(但它有意义):
my $count = @list[1..4];
但你可以这样做:
my $count = ( grep { $_ % 2 == 0 } @list[ @subscripts ] );
它将完成所有列出parens内部的上下文评估,以评估列表中项目总数的单个值。 (虽然grep
可能足够聪明,可以计算成功,而不是形成一个新列表,因为上下文 在Perl中传播。)