On 5 May 2010 14:36, Harry Putnam <[email protected]> wrote:
> "Uri Guttman" <[email protected]> writes:
>
>> HP> The output from the script below:
>> HP> Shows 6 elements arrive in dispt($g, @ar) as @_. But when sub N(@_)
>> HP> is called, no variables arrive there. @_ is empty. When it seems like
>> HP> 5 elements should have arrived there
>>
>> well, it helps if you actually pass in arguments. @_ is NOT a global.FF
>>
>> HP> my $code = $dispt{$selection} || $dispt{'error'} ;
>> HP> $code->();
>>
>> you aren't passing anything in to $code. you need to put something in
>> the () which then is set in the @_ of the called sub.
>
> As usual, I'm a little confused here. First, what is a `global.FF'?
I don't see "FF" in uri's original post, your reader may have mangled
it. He said "@_ is NOT a global."
> And why would it matter that `...@_' is not global when its content was
> placed into a sub function?
>
> Inside dispt {...the sub function @_...} `...@_' is alive and well
>
> (I'm changing the name of the hash `%dispt' (inside sub dispt {...})to
> %hash, it was probably a poor choice of names)
>
> ------- --------- ---=--- --------- --------
> #!/blah/blah/perl
>
> ## out here in global country �...@_' is unknown
>
> dispt($var,@ar);
>
> sub dispt { ...
> ## @_ is alive here containing $var,@ar.
>
> %hash = ( print N(@_ # `...@_' is dead here at the N(@_) call)
> );
>
> ...}
>
> which is also inside sub dispt {the sub function}. Where does global
> come in?
The problem is in these lines:
sub dispt {
# snip
my %dispt = (
N => sub { print N(@_). "\n"; }, # THIS @_ HERE is the problem
# snip
);
# snip
my $code = $dispt{$selection} || $dispt{'error'} ;
$code->(); # no arguments passed to &$code
}
The problem is that you have two nested subs. You have sub dispt {}
but you also have the anonymous sub { print N(@_)."\n"; }. @_ is the
argument list to the *innermost* sub. So @_ within that anonymous sub
is not the argument list to dispt (which is ($var, @ar) ) but the
argument list to the call to the anonymous sub, which happens in the
line $code->();. There is nothing between the parens, so you pass
nothing to the anonymous sub. Therefore, within that anonymous sub, @_
is an empty array.
Example with nested subs and arglists:
sub foo {
print @_; # prints hello
sub bar {
print @_; # prints howdy. @_ is bar's arglist, not foo's
}
my $subref = sub {
print @_; # prints awooga. @_ is the anonymous sub's arglist, not foo's
};
bar('howdy');
$subref->('awooga');
}
foo('hello');
Phil
--
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
http://learn.perl.org/