Beefy Boxes and Bandwidth Generously Provided by pair Networks
"be consistent"
 
PerlMonks  

Re: Bug in Class::Struct?

by NERDVANA (Deacon)
on Apr 23, 2020 at 16:07 UTC ( [id://11115956]=note: print w/replies, xml ) Need Help??


in reply to Bug in Class::Struct?

The constructor isn’t to blame. It sounds like you expect the => operator to create scalar context, but it doesn’t. There are many who agree that => really ought to create scalar context, but this is one of those back-compat things that will probably never change. You can force scalar context with the scalar keyword, though.

Replies are listed 'Best First'.
Re^2: Bug in Class::Struct?
by Your Mother (Archbishop) on Apr 23, 2020 at 20:29 UTC

    scalar context won’t materialize a zero though. Does change the undef to an empty string; at least on perl 5.18.

      scalar context won’t materialize a zero though. Does change the undef to an empty string

      Actually, it kind of does: the match operation changes its return value based on context, so the special false value returned in scalar context is zero in numeric context. (So it's also not changing the undef to an empty string, it's changing the behavior of the match.)

        ¿Que?

        perl -MYAML -E '$vol = "asdf"; $x = { moo => $vol =~ m/^HOLDING/ }; sa +y Dump $x' --- moo: ~ perl -MYAML -E '$vol = "asdf"; $x = { moo => scalar($vol =~ m/^HOLDING +/) }; say Dump $x' --- moo: ''
Re^2: Bug in Class::Struct?
by freonpsandoz (Beadle) on Apr 26, 2020 at 22:56 UTC

    Yes, in absence of any documentation to the contrary in https://perldoc.perl.org/perlop.html#Comma-Operator I would expect the operator to force scalar context. If it's a "back-compat thing," shouldn't it be highlighted in the documentation? Also, is there any reason the constructor can't do it if the operator doesn't? (I have to admit that I'm not even sure what the documentation for m// means when it says the search returns true or false, since Perl doesn't have explicit boolean values. Is assigning the return value to a scalar or passing it to a function not well-defined?) Thanks.

      in absence of any documentation to the contrary in https://perldoc.perl.org/perlop.html#Comma-Operator I would expect the operator to force scalar context.

      It's documented in List value constructors:

      LISTs do automatic interpolation of sublists. That is, when a LIST is evaluated, each element of the list is evaluated in list context, and the resulting list value is interpolated into LIST just as if each individual element were a member of LIST.

      A cross-reference between the two docs probably wouldn't hurt.

      You might be interested in PerlX::Maybe.

      I have to admit that I'm not even sure what the documentation for m// means when it says the search returns true or false, since Perl doesn't have explicit boolean values.

      See Truth and Falsehood (there used to be a section in the Perl docs).

        > there used to be a section

        It was moved to perldata, and there might be a link to it from the old location.

        map{substr$_->[0],$_->[1]||0,1}[\*||{},3],[[]],[ref qr-1,-,-1],[{}],[sub{}^*ARGV,3]
      A sub without a prototype (such as this constructor) always provides list context. Even if it had a prototype, prototypes are ignored when calling a sub as methods of a package or object. But even if they weren’t ignored, the prototype would limit you to a very specific list of arguments, and not the free-form key/value pairs that are popular for constructing objects. In general, assume list context for function arguments.

      Perl’s “boolean” is exactly what you get from the result of the not operator, which is 1 for true, or a dualvar for false that evaluates as both empty string and as 0 depending how it gets used. I think its fair to refer to these as True and False in the context of perl. (and perhaps stockholm syndrome, but after using this for some years it starts to seem really unnecessary for other languages to have dedicated boolean constants, heh)

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others making s'mores by the fire in the courtyard of the Monastery: (2)
As of 2024-04-16 20:32 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found