Beefy Boxes and Bandwidth Generously Provided by pair Networks
Do you know where your variables are?

Re^2: Purpose of =~ and = in this statement

by sherab (Scribe)
on May 23, 2022 at 17:48 UTC ( #11144133=note: print w/replies, xml ) Need Help??

in reply to Re: Purpose of =~ and = in this statement
in thread Purpose of =~ and = in this statement

I quickly wrote a script to verify and sure enough! I learned something new here. Many thanks haukex for your help!
  • Comment on Re^2: Purpose of =~ and = in this statement

Replies are listed 'Best First'.
Re^3: Purpose of =~ and = in this statement
by haukex (Archbishop) on May 23, 2022 at 17:53 UTC

    Glad to help! And yes, writing quick test scripts is one of my personal favorite ways to learn things like this.

    Side note: I don't know what the original author's intentions were, but it may be worth considering that any $chapter containing 5, including 15, 50, etc. will all be silently converted to 5.

Re^3: Purpose of =~ and = in this statement
by Marshall (Canon) on May 25, 2022 at 20:06 UTC
    I really enjoyed the posts from haukex - all great advice.

    There is another formulation of your "if this" then do "that" task. I see that chapter "numbers" could be a string like "11V". You also don't say, but I suspect that there are other statements like your chapter 5 statement for other chapters.

    Instead of this being chapter number 5 specific, you could have a regex something like this at the beginning of the loop which would apply to any chapter string, not just chapter 5:

    $chapter =~ s/\D+//g; # remove all non-digit characters # or perhaps to avoid the /g flag, (I wouldn't code it this way # because it is overly complex) however: $chapter =~ s/^(\D*)(\d+)(\D*)/$2/; # remove all optional non-digit s +tuff # before or after the digits # try the above with "XX546YYY", just "453ZZ" and "AAA123ZZZ77548" as # cases to probe the limits... what happens if it is not just "11VI"?
    In both of the statements above, the string "5" is unaffected, but if it has some extra stuff like "5VI", the "VI" is removed. I would put a statement like that the beginning of the loop because it handles all number possibilities.

    A subtle point is that a "number" in Perl could be represented by a "string" or an actual "numeric value". By and large, you do not have to worry about this because Perl will "do the right thing". Your statement says: if the string that represents "chapter" contains a "5", then set chapter to a numeric 5 (meaning binary 0000101 instead of whatever the string "5" or "657"codes to).

    Perl makes this "string representing a number" to "actual binary number" conversion for you automatically. So, this is fine:

    my $x = "3"; if ($x > 3){...}
    In order to do the numeric comparison, Perl will convert the string "3" to binary and compare that to 000011.

    my $x = "chapter 5"; print "chap 5 ok!" if $x == 5; # Throws Warning: Argument "chapter 5" isn't numeric in numeric eq (== +) $x =~ s/\D+//g; # eliminate all non 0-9 characters from string print "chap 5 ok!" if $x == 5; # chapter 5 is ok now! # The string got "fixed" to be completely numeric # Then when Perl made it into binary number to compare against 5, it w +orked!
    BTW, there is one non-numeric string which Perl will convert to numeric without a warning: "zero0 but true". That will equal numeric binary zero, but will test as "true" in logical expression. The modern way to do that is the string "0E0". The DBI can use this in some situations where it wants to say: 1)the command worked (true), but 2) there were no valid results returned, i.e. numeric zero. Pretty Cute!

    One place where the difference between string and numeric representations of a number can occur is with leading zeroes.

    $x = "00005"; print "$x\n"; #yields "00005" $x += 0; #adding zero forces numeric conversion print "$x\n"; #yields "5"
    In some situations, I need an integer binary value anyway to put into some DB and what I receive as textual description of that number may have a leading zero. Instead of using regex, I just add zero that number. bingo, $num +=0; $num now has a binary representation in Perl whether it did or not before and there will not be any leading zeroes if I print it or use it otherwise in a string context.
        Thanks for the correction, my memory was fuzzy.

        I think that this string "0 but true" is a very ancient artifact dating from before scientific notation. I have never seen this in my coding. I have however encountered "0E0" with the DBI as the normal, standard way to say "statement worked correctly, but produced a zero result", true in a logical comparison sense, but numeric zero in a numeric sense.

Log In?

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

How do I use this? | Other CB clients
Other Users?
Others imbibing at the Monastery: (2)
As of 2023-03-22 02:58 GMT
Find Nodes?
    Voting Booth?
    Which type of climate do you prefer to live in?

    Results (60 votes). Check out past polls.