【问题标题】:Perl compilation woesPerl 编译问题
【发布时间】:2010-11-03 02:37:20
【问题描述】:

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

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

谁能看出问题出在哪里?

【问题讨论】:

    标签: perl sigils perl-context


    【解决方案1】:

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

    my @slice = @hash{ @select_keys };
    

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

    my $value = $hash{ $key };
    

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

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

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

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

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

    你不太可能这样做(但它是有意义的):

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

    但你可以这样做:

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

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

    【讨论】:

      猜你喜欢
      • 2016-04-11
      • 1970-01-01
      • 2011-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多