Beefy Boxes and Bandwidth Generously Provided by pair Networks
Come for the quick hacks, stay for the epiphanies.
 
PerlMonks  

Bug in Class::Struct?

by freonpsandoz (Beadle)
on Apr 23, 2020 at 02:42 UTC ( [id://11115922]=perlquestion: print w/replies, xml ) Need Help??

freonpsandoz has asked for the wisdom of the Perl Monks concerning the following question:

Hi all,

(See also Node ID 859845.) I have a script that initializes a struct using new, and supplies a pattern match to initialize a scalar component of the struct as:

holding => $vol =~ m/^HOLDING/,

The struct member 'holding' appears to be assigned undef instead of 0 when the match fails. Whatever Class::Struct::new() does doesn't seem to correctly create a scalar context for scalar member accessor methods. Is this a bug? Depending on the expression supplied to initialize a scalar member, it seems like unexpected results could be produced. Thanks.

Replies are listed 'Best First'.
Re: Bug in Class::Struct?
by swl (Parson) on Apr 23, 2020 at 04:46 UTC
Re: Bug in Class::Struct?
by stevieb (Canon) on Apr 23, 2020 at 03:38 UTC

    Are you speaking about Use of uninitialized value when using regex thread?

    It doesn't seem to me to be relevant.

    Either way, can you show us some code that reproduces the problem, and if not, at least all the code that contains the instantiation of the object, and a few lines of code surrounding, and including the problematic line?

Re: Bug in Class::Struct?
by NERDVANA (Deacon) on Apr 23, 2020 at 16:07 UTC
    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.

      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.)

      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).

        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: perlquestion [id://11115922]
Front-paged by Corion
help
Chatterbox?
and the web crawler heard nothing...

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

    No recent polls found