in reply to Re: USE statement, search method
in thread USE statement, search method

Thanks for looking at this, and I finally found a way for perl to use MY copy of SJISTermFilter.pm, and I put print statements in it and discovered it is hanging on these statements:

print "Now in mainline code at line 153\n"; # and tie default filehandles tie(*STDOUT, "Amazon::DistributionCenter::SJISTermFilter", *STDOUT); print "Now in mainline code after tie of STDOUT\n"; tie(*STDERR, "Amazon::DistributionCenter::SJISTermFilter", *STDERR); print "Now in mainline code after tie of STDERR\n"; tie(*STDIN, "Amazon::DistributionCenter::SJISTermFilter", *STDIN) if +($ENV{ENABLE_SJISTERMFILTER_INPUT}); print "Now in mainline code after tie of STDIN\n"; tie(*ARGV, "Amazon::DistributionCenter::SJISTermFilter", *ARGV) if +($ENV{ENABLE_SJISTERMFILTER_INPUT}); print "Now in mainline code after tie of ARGV\n";

The print statements are mine, just to see where it was crashing, and I can see it never makes it past the very first tie statement. My question is, what is tie? I've never heard of it.

and another thing. All of my books tell me that a use is kind-of like a C #include, where it just brings code in, but doesn't execute it. Well, I find that to be false. It brings it in AND executes it. Are the books wrong?

Replies are listed 'Best First'.
Re^3: USE statement, search method
by chromatic (Archbishop) on Dec 08, 2007 at 06:22 UTC
    The print statements are mine, just to see where it was crashing, and I can see it never makes it past the very first tie statement. My question is, what is tie? I've never heard of it.

    tie lets you change the basic operations you can perform on a variable. In this case, it changes the default filehandles so that all attempts to print to them do something different. (This implies that your print statements won't do what you think, because you're printing to newly-tied filehandles.)

    All of my books tell me that a use is kind-of like a C #include, where it just brings code in, but doesn't execute it. Well, I find that to be false. It brings it in AND executes it. Are the books wrong?

    Yes and no. Eventually even C programs execute included code. use loads and compiles the requested code. If that code has any code to execute at or immediately after compilation time, Perl will execute it at the appropriate time. If there's no code to execute as part of the compilation process, any of the requested code will only execute when something else calls it.

      As I said, it never gets past the first tie statement. My program then ends with an 'Out of memory' error. Do you know of any outstanding issues with tie?

        As I said, it never gets past the first tie statement.

        I don't believe you can know that, because you're printing to a tied filehandle. Now maybe you ran the code in the debugger and verified it, or maybe you looked in the appropriate log, or read the code of the tie class, but that's certainly not obvious. You need to know where the program really is ending if you want to hope to debug it.

        Do you know of any outstanding issues with tie?

        It's been around and well-tested in the core for over a decade, so my instinct tells me to look in the class to which you're tieing after you've identified where the problem occurs.