develooper Front page | perl.perl5.porters | Postings from January 2018

Re: [perl #132732] use if - behaviour does not match documentation

Thread Previous | Thread Next
From:
Abigail
Date:
January 25, 2018 11:29
Subject:
Re: [perl #132732] use if - behaviour does not match documentation
Message ID:
20180125113329.GC3512@almanda.fritz.box
On Wed, Jan 24, 2018 at 10:09:56AM -0800, James E Keenan via RT wrote:
> On Wed, 24 Jan 2018 17:38:14 GMT, grinnz@gmail.com wrote:
> > On Wed, Jan 24, 2018 at 12:33 PM, James E Keenan <jkeenan@pobox.com>
> > wrote:
> > 
> > > On 01/24/2018 12:20 PM, Dan Book wrote:
> > >
> > >> From the source code, 'no if' appears to do the same thing as 'use
> > >> if'
> > >> but runs unimport instead of import. It's not a negation of the
> > >> condition.
> > >> This is consistent with 'no' and 'use' but the negation is not
> > >> explained
> > >> very well IMO.
> > >>
> > >>
> > > So, would a proper test then be to import specific functions, then
> > > use 'no
> > > if CONDITION, "MODULE" ARGUMENTS to unimport them?
> > >
> > >
> > That should be reasonable, but note that not many modules implement
> > unimport; 'no warnings' is probably the most common usage of 'no'.
> > 
> > -Dan
> 
> Well, the reason I used bigrat in the tests is that it does contain a 'sub unimport'.
> 
> As does 're'.  But there I get even stranger results.  Try this out (in the patch):
> 
> #####
>     {
>         eval "use if (0 > 1), q|re|, qw(is_regexp regexp_pattern);";
>         ok (! re->can('is_regexp'), "Cannot is_regexp");
>         ok (! re->can('regexp_pattern'), "Cannot regexp_pattern");
>         ok (  re->can('is_regexp'), "Can    is_regexp");
>         ok (  re->can('regexp_pattern'), "Can    regexp_pattern");
>     }
> #####
> I get:
> #####
> not ok 11 - Cannot is_regexp
> #   Failed test 'Cannot is_regexp'
> #   at t/if.t line 73.
> not ok 12 - Cannot regexp_pattern
> #   Failed test 'Cannot regexp_pattern'
> #   at t/if.t line 74.
> ok 13 - Can    is_regexp
> ok 14 - Can    regexp_pattern
> #####
> 
> Which I read as, "Whether or not the CONDITION evaluates to true or not, the two functions are imported from package 're'."
> 


That code checks whether the class 're' has a subroutine 'is_regexp' --
which it will as long as it's loaded.

To check whether it has been imported, you need to call "can" on the
class functions are imported *to*:

  #####
      {
          eval "use if (0 > 1), q|re|, qw(is_regexp regexp_pattern);";
          ok (! main::->can('is_regexp'), "Cannot is_regexp");
          ok (! main::->can('regexp_pattern'), "Cannot regexp_pattern");
          ok (  main::->can('is_regexp'), "Can    is_regexp");
          ok (  main::->can('regexp_pattern'), "Can    regexp_pattern");
      }
  #####

Assuming your code runs in the main package.



Abigail

Thread Previous | Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About