Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer
 
PerlMonks  

Re: On Backwards Compatibility and Bareword Filehandles

by ikegami (Patriarch)
on Jul 17, 2020 at 18:05 UTC ( [id://11119461]=note: print w/replies, xml ) Need Help??


in reply to On Backwards Compatibility and Bareword Filehandles

I don't see the basis for these changes. What's the problem with using a scalar? Maybe you could specify what problem you are trying to solve? That would be the first step in providing the needed justification that appears completely missing.

The historical similarity to the I/O syntax creates some parse conflicts and it is not possible to call a constructor named open in IO syntax because of these parse conflicts, but I offer a solution in three parts:

But that problem is already being solved. That's only a problem when using indirect method notation, which has long been discouraged by some (incl myself), and which is being "removed".

  • Comment on Re: On Backwards Compatibility and Bareword Filehandles

Replies are listed 'Best First'.
Re^2: On Backwards Compatibility and Bareword Filehandles
by jcb (Parson) on Jul 17, 2020 at 23:29 UTC

    The problem with using scalars for all I/O handles is all of the existing code that uses barewords; this solution maintains backwards compatibility at least for the simple cases that I expect are the most common.

    Another problem is philosophical: removing features from the language because you do not like that style is not the Perl way. Perl advocates TIMTOWTDI; One True Right And Only Way is Python's niche and Python fills that niche very well.

      Another problem is philosophical: removing features from the language because you do not like that style is not the Perl way.

      I continue to fail to understand this argument. Who is saying "bareword filehandles should go away solely because I don't like the style"

      Can you do Chesterton's Fence here? What technical arguments are there for discouraging bareword filehandles? Or, to make this easier, undeclared barewords in general?

        What technical arguments are there for discouraging bareword filehandles?

        There's the lack of scoping. You could use open(local *FOO, ...) to protect the caller, though. So I guess the real problem is that lack of scope-enforcement under use strict;.

        Also, they're very low on the totem pole, so they can end up meaning something unexpected.

        That is a short summary of the impression that I got from previous discussions on the topic of indirect filehandles in Perl, particularly in the case of code at the top-level of the main script, where a (global) bareword filehandle and a file-scope lexical have effectively the same scope.

        There seems to be some confusion here — I am arguing that bareword filehandles should remain in the language, but suggesting a compromise of making bareword filehandles lexical variables. I expect that the arguments in favor of declaring bareword filehandles (and giving them lexical scope) are essentially the rationale for use strict 'subs' prohibiting the old "bareword-as-unquoted-string" behavior.

      It would be far simpler to automatically convert

      open(FOO, ...)

      to

      open(local *FOO, ...)

      instead. While FOO is still technically global, the caller is protected.

      Note that automatically limiting the scope of variables used as file handles will break code.

        Or if barewords can no longer be used as a file handles, you could pre-declare them using

        use Symbol qw( gensym ); sub FOO { state $fh = gensym(); $fh } open(FOO, ...)

        This is close, but does not actually give the same benefits. Lexical bareword filehandles move a bit of complexity into the parser, but allow the *foo{IO} slot to be removed from GV, simplifying the rest of the interpreter guts. Lexical bareword filehandles allow at least the simple cases to continue to work, even though I/O would be done only through =IO objects.

        Some breakage is to be expected across major versions, but the goal is to maximize the amount of old code that continues to work, while still improving perl and its I/O handling.

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others goofing around in the Monastery: (4)
As of 2024-04-24 03:40 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found