in reply to Re: way of declare an integer variable instead use /^\d+$/
in thread way of declare an integer variable instead use /^\d+$/

someone might disagree, it's no good for perl.
  • Comment on Re^2: way of declare an integer variable instead use /^\d+$/

Replies are listed 'Best First'.
Re^3: way of declare an integer variable instead use /^\d+$/
by LanX (Saint) on May 26, 2024 at 11:14 UTC
    Perl is, contrary to C, a dynamically typed language.

    A static typing, i.e. at compilation time, is nearly impossible.

    Otherwise you'd need to type everything, including the result of functions. Even then....¹

    A check at runtime is costly, that's why dynamically typed languages are slower, but easier to code.

    As I already said, you could tie the variable with a self-made STORE (This, Value) function which does your checks on Value before storing it.

    Attribute::Handlers has an example for Syntactic sugar to "hide" the tie-ing procedure behind an attribute.

    I'm not aware of any CPAN modules already providing that, especially because there are certainly different models how to react on wrong types ( die , warn , transform, combine)

    I already gave you all the links, you'd need to do it yourself for your own needs.

    For instance 1E0 is a whole number in float notation, opinions will differ.

    I'm saying all of this for completeness, because it's a total overkill for your problem.

    There is no magic wand which can do the heavy lifting for you...

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

    ¹) Perl, like other dynamic languages, does a lot of DWIM typecasting of variables. This doesn't translate well if you want to keep it fast.

      As I already said, you could tie the variable with a self-made STORE ( +This, Value) function which does your checks on Value before storing +it.

      allow me to clarify the above, in reference to what you said before that:

      You could use Tie::Scalar to make sure that a var $x will always stay +an integer, by declaring STORE. But that will slow down every operati +on on $x.
      , just use the slow Tie::Scalar to only do the validation, then store the validated integer into a "normal" variable.

        > then store the validated integer into a "normal" variable.

        I never said this, but I thought about it in order to limit the speed penalty.

        But using two variables is somehow sabotaging the intent of nicer code....

        I'm not sure about if the performance penalty for tied variables also hits if FETCH was not altered, but I think it's very likely so.

        An XS implementation might levitate this, not sure which kinds of "magic" are possible here.

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

      Tie::Scalar whatever it can do,it's overkill to declare an integer, I do not know how to implement it, I seldom use class in my scripts.

      It may be either-or, I can not have both, regex is a much general define method, I'm learning to appreciate it, since 'every perl script use regex'