On Thu, Jul 23, 2009 at 02:30:55PM +0200, Johannes Sixt wrote: > Jeff King schrieb: > > +my %EXPANDED_ALIASES; > > +sub expand_one_alias { > > + my $alias = shift; > > + if ($EXPANDED_ALIASES{$alias}) { > > + die "fatal: alias '$alias' expands to itself\n"; > > + } > > + local $EXPANDED_ALIASES{$alias} = 1; > > + return $aliases{$alias} ? expand_aliases(@{$aliases{$alias}}) : $alias; > > What does 'local' make local here? Only the assignment of the slot > $EXPANDED_ALIASES{$alias}? Or the whole %EXPANDED_ALIASES? If the latter, > does this copy the existing %EXPANDED_ALIASES before the assignment is > made; otherwise, how can this work if only ever a single slot of > %EXPANDED_ALIASES is filled in? It localizes just that slot. But remember that 'local' is about _dynamic_ scoping, not _lexical_ scoping. So that slot is now set for the duration of the expand_one_alias call, and is visible to its subroutines (i.e., the recursive calls). So each level of recursion sets one more field in $EXPANDED_ALIASES, and when we leave the function, perl automatically restores it to its previous value. -Peff -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html