in reply to Re: restore overridden XS methods
in thread restore overridden XS methods

Under -w, I get:
Subroutine gettimeofday redefined at z:\test.pl line 6.
Constant subroutine gettimeofday redefined at z:\test.pl line 8.
Modified: 42
Restored: 1172750176936000
So, it works, kinda. With warnings.

But unfortunately, local does not work:

#! perl -w use strict; use Time::HiRes; { local *Time::HiRes::gettimeofday{CODE} = sub(){42}; print "Modified: ", Time::HiRes::gettimeofday,"\n"; } print "Restored: ", Time::HiRes::gettimeofday
This results in the following compile time error:
Can't modify glob elem in local at z:\test.pl line 5, near "} ="
Execution of z:\test.pl aborted due to compilation errors.

Replies are listed 'Best First'.
Re^3: restore overridden XS methods
by BrowserUk (Patriarch) on Mar 01, 2007 at 13:11 UTC

    local works if you use glob assignment syntax:

    { local *Time::HiRes::gettimeofday = sub { print 42; }; print Time::HiRes::gettimeofday(); };; Subroutine Time::HiRes::gettimeofday redefined at (eval 4) line 1, <ST +DIN> line 2. 42 1 print Time::HiRes::gettimeofday();; 1172754765 437500

    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.
      Clever. The only problem I see is that if there are other variable types attached to the name Time::HiRes::gettimeofday, such as $Time::HiRes::gettimeofday or @Time::HiRes::gettimeofday, that those will be overridden too.

      I don't think it matters for this particular case — or even, in most cases.

        I'm not sure I understand what you mean?

        ## Assign appropriate values to 3 different slots in the glob *t = sub{ print 42 }; *t = \'fred'; *t = [ 1,2,3];; ## And print them print join "\n", t(), $t, "@t";; 42 1 fred 1 2 3 ## Locally override the code slot and print them--the others are untou +ched. { local *t = sub { print 'changed' }; print join "\n", t(), $t, "@t"; };; Subroutine main::t redefined at (eval 5) line 1, <STDIN> line 3. changed 1 fred 1 2 3 ## print them again having exited the block, ## and they all retain their original values print join "\n", t(), $t, "@t";; 42 1 fred 1 2 3

        Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
        "Science is about questioning the status quo. Questioning authority".
        In the absence of evidence, opinion is indistinguishable from prejudice.