Perl编译困境

时间:2010-11-03 02:37:21

标签: perl sigils perl-context

我正在编译这种方法:

#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 个答案:

答案 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中传播。)