http://qs321.pair.com?node_id=11121110


in reply to Re^4: Split tab-separated file into separate files, based on column name (tangent = open on demand => stream-like)
in thread Split tab-separated file into separate files, based on column name

That's another good example why overloading is doomed to fail if the operator isn't semantically compatible.

Regarding your question:

Either you can try to manipulate the __WARN__ handler in %SIG

Or you can try exporting warnings inside import() like demonstrated in Modern::Perl

(And I agree about the productive code part. ;)

Cheers Rolf
(addicted to the Perl Programming Language :)
Wikisyntax for the Monastery

Updates

Rephrased and linked

  • Comment on Re^5: Split tab-separated file into separate files, based on column name (tangent = open on demand => stream-like)
  • Download Code

Replies are listed 'Best First'.
Re^6: Split tab-separated file into separate files, based on column name (tangent = open on demand => stream-like)
by Eily (Monsignor) on Aug 27, 2020 at 08:34 UTC

    I'm not much of a fan of operator overloading anyway. But I thought it was a nice thought experiment, and again, maybe acceptable for oneliners.

    I still tried to cheat the system and go around the "useless use [...] in voix context" by using <<= instead of << because $magic << "Value"; returns $magic itself so $magic <<= "Value"; works fine.
    Except it failed when trying to turn this: $magic << "Value" << "Other value"; into $magic <<= "Value" <<= "Other value";, because << is a left associative operator and <<= is a right associative one. Meanig you've just turned ($magic << "Value") << "Other"; into $magic <<= ("Value" <<= "Other");. Whoops.

    So yes, the lesson is don't add new semantic to operators kid (yup, I'm looking at you C++).

      Operator overloading is great, I'm not against it per se.

      But it's a two-edged sword which should be handled with care.

      Overloading an operator because it looks like another syntax is not a good idea ( here >> )

      A good example for overloading are set operations, because the logic is "compatible".

      • X * Y intersection
      • X + Y join
      • X - Y difference
      • - X complement
      I could also attempt to use the logical && family but short circuiting could sabotage it.

      Bitwise ~ | & ^ etc. might be another option tho ... and the analogy between sets and bit vectors might help.

      update

      Found Set::Scalar which has a good set of overloaded operators.

      Cheers Rolf
      (addicted to the Perl Programming Language :)
      Wikisyntax for the Monastery

        A good example for overloading are set operations, because the logic is "compatible".
        • X * Y intersection
        • X + Y join
        • X - Y difference
        • - X complement

        I don't see how the logic is compatible, unary - as complement means X - Y is different from X + (-Y). And there's just no relation between * and + anymore. At least with + for concatenation (which I already don't like much), you can have STRING * 3 to be equivalent to STRING + STRING + STRING.

        And actually now that I think of it, the best operator to overload to append to a file is .=. With the dot you have both the append and string semantic, and the = makes it ok for the operation to have an effect on the left operand. And it makes chaining more consistent:
        file("path") .= "First string" . "Second string";