Chas Owens wrote:
> On 6/8/07, Robert Hicks <[EMAIL PROTECTED]> wrote:
>> I see some modules that call "new" like:
>>
>> my $test = new Some::Module;
>>
>> and some like:
>>
>> my $test = Some::Module->new;
>>
>> Is there a difference and what is the "recommended" way?
>>
>> Robert
>
> "new Object" uses indirect invocation*. Some people feel it improves
> readability; I am not one of those people.
>
> from perldoc perlobj
> There is another problem with this syntax: the indirect object is
> lim‐
> ited to a name, a scalar variable, or a block, because it would
> have to
> do too much lookahead otherwise, just like any other postfix derefer‐
> ence in the language. (These are the same quirky rules as are
> used for
> the filehandle slot in functions like "print" and "printf".) This
> can
> lead to horribly confusing precedence problems, as in these next two
> lines:
>
> move $obj->{FIELD}; # probably wrong!
> move $ary[$i]; # probably wrong!
>
> Those actually parse as the very surprising:
>
> $obj->move->{FIELD}; # Well, lookee here
> $ary->move([$i]); # Didn't expect this one, eh?
>
> Rather than what you might have expected:
>
> $obj->{FIELD}->move(); # You should be so lucky.
> $ary[$i]->move; # Yeah, sure.
>
> To get the correct behavior with indirect object syntax, you would
> have
> to use a block around the indirect object:
>
> move {$obj->{FIELD}};
> move {$ary[$i]};
>
> Even then, you still have the same potential problem if there happens
> to be a function named "move" in the current package. The "->" nota‐
> tion suffers from neither of these disturbing ambiguities, so we
> recom‐
> mend you use it exclusively. However, you may still end up having to
> read code using the indirect object notation, so it's important to be
> familiar with it.
I will read "perlobj" then...
Thanks!
Robert
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/