Beefy Boxes and Bandwidth Generously Provided by pair Networks
Problems? Is your data what you think it is?
 
PerlMonks  

Re: This could have DWIM better

by demerphq (Chancellor)
on Mar 01, 2006 at 17:40 UTC ( [id://533707]=note: print w/replies, xml ) Need Help??


in reply to This could have DWIM better

There is always:

D:\>perl -we"my $x; print length($x.='')" 0
---
$world=~s/war/peace/g

Replies are listed 'Best First'.
Re^2: This could have DWIM better
by Aristotle (Chancellor) on Mar 01, 2006 at 18:29 UTC

    Yeah, that works to suppress the warning. It’s still an unnecessary hoop to jump through though, and I’m not keen on unnecessary side effects, even if they are usually transparent. (F.ex., what if this is a tied scalar?)

    It also loses the distinction between undef and an empty string, should that be needed.

    Compared to the alternative length behaviour, it does remove the need for checking definedness of the return value if it’s needed in calculations, but you can simply apply your approach to the return value instead then: $len += 0; And that avoids the problem with side effects, as the return value of length is never overloaded.

    I hadn’t considered this particular point, but as I said, any way the matter is turned, I cannot find a reason to prefer the currently implemented behaviour.

    Makeshifts last the longest.

      Sorry, i was probably too terse. I wasnt suggestingthat this was a good replacement for your code, just that it was possible.

      ---
      $world=~s/war/peace/g

Re^2: This could have DWIM better
by demerphq (Chancellor) on Mar 01, 2006 at 18:03 UTC

    I daren’t use it in any complex codebase that relies on a lot of CPAN code either.

    Why? I thought that this trick would only affect the module its declared in. Its not going to have a global effect fwir.

    ---
    $world=~s/war/peace/g

      Quoth perlsub:

      Library modules should not in general export built-in names like open or chdir as part of their default @EXPORT list, because these may sneak into someone else’s namespace and change the semantics unexpectedly. Instead, if the module adds that name to @EXPORT_OK, then it’s possible for a user to import the name explicitly, but not implicitly. That is, they could say

      use Module 'open';

      and it would import the open override. But if they said

      use Module;

      they would get the default imports without overrides.

      The foregoing mechanism for overriding built-in is restricted, quite deliberately, to the package that requests the import. There is a second method that is sometimes applicable when you wish to override a built-in everywhere, without regard to namespace boundaries. This is achieved by importing a sub into the special namespace CORE::GLOBAL::.

      Emphasis mine.

      Makeshifts last the longest.

        Ah, thanks for the clarification. I misremembered this. Am I correct that this doesnt apply to prototypeless routines like print?

        ---
        $world=~s/war/peace/g

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others romping around the Monastery: (3)
As of 2024-04-20 00:08 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found