in reply to Re: (jeffa) Re: 'print' puzzle
in thread 'print' puzzle

Make sure that when you say "context", you're not thinking "scalar" and "list" context. Those don't apply here. Read on...
print FOO $bar;
Puts the contents of $bar on the filehandle FOO. We're all clear on that.
print(FOO $bar);
Does exactly the same thing in a nicely Perl 4-ish way. Perl's parser knows that the first argument to print (regardless of the parens) might be a filehandle which won't be comma-separated from the first thing to be printed. Now:
print(Package::FOO $bar);
Falls into the same trap. You're just specifying the package that the filehandle is in. The solutions:
print +(Package::FOO $bar);
The + tells the parser that the parens don't go with the print (and therefore the Package::FOO) and they're just grouping. So the parser isn't looking for a filehandle anymore. The Package::FOO gets used with indirect object syntax.
print(Package::FOO($bar));
The parser doesn't see a first-argument space-separated from the things to be printed and knows that Package::Foo is Something Else. (Later it'll know it's a function call.)
print(&Package::FOO $bar);
Same goes here, the parser doesn't see a filehandle here and knows that it shouldn't go looking here for one.

I hope that helps. More importantly I hope my lack-of-sleep answer didn't cause more questions than answered...

Replies are listed 'Best First'.
Re: Re: Re: (jeffa) Re: 'print' puzzle
by John M. Dlugosz (Monsignor) on Nov 13, 2001 at 03:18 UTC
    Yes that helps. You say that the parens don't affect it. The "if it looks like a function" rule tells it were the parameter list ends, but the determination that the first argument doesn't have a comma after it must come after that.

    So... why doesn't it know that's a function already? The module was "use"d, so it knows what's inside it.

      There are so many exceptions and interpretations to the "if it looks like a function" rule that it's almost more of a pain than a help. Just let it go. To your second comment, it knows that it's already a function but it doesn't matter -- it could also still be a filehandle. Remember you don't "predeclare" filehandles in any way. And Perl's kinda looking for a filehandle there anyway and your function name will suit just fine.