2010-11-03 74 views
0

我有一些troble編譯這個方法:的Perl編譯困境

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

任何人都可以看到的問題是什麼?

回答

7

是的,你可以從一個哈希這樣的切片(即多個值):

my @slice = @hash{ @select_keys }; 

而且你可以從一個哈希這樣一個值:

my $value = $hash{ $key }; 

但你不能用一個開始的'%'sigil來解決散列問題。這對於Perl 6來說意義不大(sigils不會根據數量而改變)。

因爲你想出來的哈希的一個項目,你的任務應該是:

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

有三個上下文在Perl,無效列表。印記更多地是上下文的部分變量名稱的指示。當沒有人期望從表達式返回結果時,我們會看到一個void上下文。這種情況只發生在sub-s,當程序員只是想要完成某些事情時,並不關心是否返回一個值。

只留下標量列表在談論變量時。這種工作像一種語言中的單數和複數形式。由於Larry Wall在設計Perl時受到自然語言的影響,這些相似之處自然也是。但是沒有「哈希上下文」。當然,讓事情稍微複雜一點,在標量上下文中被評估爲列表的內容也具有上下文意義,它只是評估結果列表的大小。

你就不太可能做到這一點(但它有一個意思):

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

但你可以這樣做:

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

它會做的括號內的所有列表環境評估,以評估列表中項目總數的單個值。 (雖然grep可能足夠智能以計算成功,而不是形成一個新的列表,因爲上下文在Perl中傳播。)

+0

謝謝Axeman - 出色的工作! – 2010-11-03 03:05:37