> #!/usr/bin/perl
> use strict;
> use warnings;
> 
> sub my_fn { print "in sub my_fn, args='@_'\n" }
> 
> # This happily calls my_fn(): the parameters received by my_fn are
> # 'sample.t' and 'def'. But why?
> 
> 'sample.t'->main::my_fn('def');
> 
> # ... yet this fails with: Can't call method "main::my_fn" without
> # a package or object reference
> 
> './sample.t'->main::my_fn('def');

For cheap thrills, I grep'ed the Perl C sources for the error message
and found it in file pp_hot.c/S_method_common():

    if (!packname ||
        ((UTF8_IS_START(*packname) && DO_UTF8(sv))
            ? !isIDFIRST_utf8((U8*)packname)
            : !isIDFIRST(*packname)
        ))
    {
        Perl_croak(aTHX_ "Can't call method \"%s\" %s", name,
                   SvOK(sv) ? "without a package or object reference"
                            : "on an undefined value");
    }
    /* assume it's a package name */
    ...

Hmm, it seems that if the first char is [A-Za-z_] it's assumed to be
a package -- which explains why 'sample.t' worked and './sample.t'
didn't. To test that theory further:

#!/usr/bin/perl
sub What::the::_::is::going::on { print+reverse$/,@_ }
'[EMAIL PROTECTED]&?!! is going on?'->What::the::_::is::going::on('What the ');

Not sure if this is a bug or a feature, but it sure is fun. :-)

/-\


http://mobile.yahoo.com.au - Yahoo! Mobile
- Check & compose your email via SMS on your Telstra or Vodafone mobile.

Reply via email to