Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation

Re: detecting changes in a localised variable

by TedYoung (Deacon)
on Feb 18, 2005 at 22:25 UTC ( #432551=note: print w/replies, xml ) Need Help??

in reply to detecting changes in a localised variable

Here I tie $_ to a Complainer package that can warn/carp/croak any time something tries to assign to it.

#!perl -l package Complainer; use Tie::Scalar; use base Tie::StdScalar; use Carp; sub STORE { # Warn out any status info you want here. carp "Tried to assign to \$_"; } sub FETCH { $_ } package main; tie $_, Complainer; $_ = 1; local $_;

Update: Added the fetch method so that reading $_ actually works. not sure why I have to do that, Tie::StdScalar should handle that for me... but this was written in a hurry.

Ted Young

($$<<$$=>$$<=>$$<=$$>>$$) always returns 1. :-)

Replies are listed 'Best First'.
Re^2: detecting changes in a localised variable
by Tanktalus (Canon) on Feb 18, 2005 at 22:46 UTC

    Tie? That's an idea I obviously didn't have. However, when trying your code, which I am ever so grateful for, I noticed that local $_ caused the carping - which was what I was trying to avoid. Since $_ was now localised, I didn't care if it was being changed because that's kinda like a new value. Somewhere in my do_something_complex function, I'm causing a file to be loaded (only once - there's lots of caching going on). And that file load has a "while (<$fh>)" line in it to parse out the file. And so I'm getting about a bazillion carps - even after localisation.

    Hopefully this helps make my original query more clear... maybe not possible, but clear :-)

    Update: That all said, this file load was the problem. So my code is cleaner now because of this, although the general question is, I think, a useful question - how to determine a variable changing, discounting any localised changes. In other words, a variable whose change will propogate back up the call stack.

      Yes, I was about to mention, as I was reading your post:

      while (<FH>) {

      does not localize $_

      Ted Young

      ($$<<$$=>$$<=>$$<=$$>>$$) always returns 1. :-)

Log In?

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://432551]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others meditating upon the Monastery: (4)
As of 2022-12-04 02:00 GMT
Find Nodes?
    Voting Booth?

    No recent polls found