YenForYang has asked for the wisdom of the Perl Monks concerning the following question:

(Note: I am aware that the standard way is to use Some::Class->new, but a static function (should?) work

First I do require, as use allows them both to work for some reason (why?):

require Net::Curl; Then, the following (assume I have use strict) fails with Bareword "Net::Curl::Easy::new" not allowed while "strict subs" in use
my $c = Net::Curl::Easy::new;
while the following does not
my $c = Net::Curl::Easy->new;

Also weird is that if I enter

require Net::Curl; my $c = Net::Curl::Easy::new;
in Reply it works (as two commands). But if I entered the commands on the same line: require Net::Curl;my $c = Net::Curl::Easy::new; it fails (why?).

In addition, I'm not quite understanding the difference(s) between all these (note the command clearly isn't a reference, but just for the sake of argument). Which ones are the same, which ones are different (in general), which ones are the same in this case?:

&Net::Curl::Easy::new; &Net::Curl::Easy::new(); Net::Curl::Easy::new(); Net::Curl::Easy::new; &{Net::Curl::Easy::new}; #equivalent to Net::Curl::Easy::new->&*,right +? Net::Curl::Easy::new->();

EDIT Not using the strict pragma gives the error: 'easy' is not a Net::Curl::Easy object at the line assigning $c. I thought parentheses aren't necessary here (perldoc/perlsub):

The & is optional in modern Perl, as are parentheses if the subroutine has been predeclared.

Replies are listed 'Best First'.
Re: Why does Net::Curl::Easy->new work but Net::Curl::Easy::new does NOT?
by LanX (Saint) on May 07, 2018 at 19:30 UTC
Re: Why does Net::Curl::Easy->new work but Net::Curl::Easy::new does NOT?
by shmem (Chancellor) on May 07, 2018 at 23:39 UTC
    require Net::Curl; Then, the following (assume I have use strict) fails with
    Bareword "Net::Curl::Easy::new" not allowed while "strict subs" in use +<?c> <c> my $c = Net::Curl::Easy::new;
    while the following does not
    my $c = Net::Curl::Easy->new;

    That's because require is a runtime directive, and strict is compile time. During the parse of the script it is not distinguishable whether Net::Curl::Easy::new is a subroutine call or a bareword. Add parens to disambiguate:

    my $c = Net::Curl::Easy::new();

    or wrap the require statement into a BEGIN block:

    BEGIN { require Net::Curl::Easy }

    which loads, compiles and executes Net/Curl/Easy.pm during the parse, and thus makes known Net::Curl::Easy::new as being a subroutine in perl's symbol table.

    But then, if Net::Curl::Easy::new is not insentitive to be called as a class method or a function, (i.e. it takes arguments and doesn't validate them proper), you may have to pass the classname, as LanX noted:

    my $c = Net::Curl::Easy::new( q(Net::Curl::Easy) );

    - or not. Documentation or source code should reveal that.

    perl -le'print map{pack c,($-++?1:13)+ord}split//,ESEL'